import Zondy from '../Zondy'
import { defaultValue } from '../../util'
import { SymbolType } from '../enum'
import LineSymbol from './LineSymbol'
import LineSymbolMarker from './support/LineSymbolMarker'
/**
* 简单线符号,支持线几何对象,参考示例:<a href='#new-SimpleLineSymbol'>[线符号样式]</a>
* <br><br>[ES5引入方式]:<br/>
* Zondy.Symbol.SimpleLineSymbol() <br/>
* [ES6引入方式]:<br/>
* import { SimpleLineSymbol } from "@mapgis/webclient-common" <br/>
* <br/>
* @class SimpleLineSymbol
* @moduleEX SymbolModule
* @extends LineSymbol
* @param {Object} options 线符号样式
* @param {Number} [options.width = 1] 线符号宽度,默认为1
* @param {Color|String} [options.color = new Color(255, 0, 0, 1)] 线符号颜色,默认为红色
* @param {String} [options.cap = 'round'] 线的起点和终点样式,可选参数 "butt"|"round"|"square"
* butt:线的首尾为直角,round:线的首尾为圆形,square:线的首尾会超出一部分,且为矩形
* @param {String} [options.join = 'round'] 线的拐角样式,可选参数 "miter"|"round"|"bevel",
* miter:线的拐角为直角,round:线的拐角为圆角,bevel:线的拐角为斜角
* @param {Number} [options.miterLimit = 2] 斜接的宽度与线宽的最大允许比率,防止转角过小问题
* @param {String} [options.style = 'solid'] 线样式,默认'solid',可选"dash"|"dash-dot"|"dot"|"long-dash"|"long-dash-dot"|"long-dash-dot-dot"|"none"|"short-dash"|"short-dash-dot"|"short-dash-dot-dot"|"short-dot"|"solid"
* @param {LineSymbolMarker} [options.marker] 线端点样式
*
* @summary <h5>支持如下方法:</h5>
* [1、克隆并返回新的符号对象]{@link Symbol#clone} <br/>
* [2、导出一个JSON对像]{@link Symbol#toJSON} <br/>
* <a href='#fromJSON'>[3、通过json构造并返回一个新的SimpleLineSymbol对象]</a>
*
* @example <caption><h7 id='new-SimpleLineSymbol'>创建线符号样式对象</h7></caption>
* // ES5引入方式
* const { SimpleLineSymbol } = Zondy.Symbol
* const { Color } = Zondy
* // ES6引入方式
* import { SimpleLineSymbol, Color } from "@mapgis/webclient-common"
* const simpleLineSymbol = new SimpleLineSymbol({
* // 线符号颜色
* color: new Color(255, 0, 0, 1),
* // 线符号宽度
* width: 2,
* // 线首尾角样式
* cap: "round",
* // 线接角样式
* join: "round",
* // 斜接的宽度与线宽的最大允许比率
* miterLimit: 2,
* // 线样式
* style: "solid"
* });
*/
class SimpleLineSymbol extends LineSymbol {
constructor(options) {
super(options)
options = defaultValue(options, {})
/**
* 符号类型
* @member {String} SimpleLineSymbol.prototype.type
*/
this.type = SymbolType.simpleLine
/**
* 首尾角样式
* @member {String} SimpleLineSymbol.prototype.cap
*/
this.cap = defaultValue(options.cap, 'round')
/**
* 接角样式
* @member {String} SimpleLineSymbol.prototype.join
*/
this.join = defaultValue(options.join, 'round')
/**
* 斜接的宽度与线宽的最大允许比率
* @member {Number} SimpleLineSymbol.prototype.miterLimit
*/
this.miterLimit = defaultValue(options.miterLimit, 2)
/**
* 线样式
* @member {String} SimpleLineSymbol.prototype.style
*/
this.style = defaultValue(options.style, 'solid')
/**
* 线端点样式
* @member {LineSymbolMarker} SimpleLineSymbol.prototype.marker
*/
const markerObject = defaultValue(options.marker, null)
if (markerObject) {
markerObject.color = defaultValue(markerObject.color, this.color.clone())
this.marker = LineSymbolMarker.fromJSON(markerObject)
} else {
this.marker = null
}
}
/**
* 通过json构造并返回一个新的SimpleLineSymbol对象<a id='fromJSON'></a>
* @param {Object} json 符号的实例化JSON
* @return {SimpleLineSymbol} 新的SimpleLineSymbol对象
* @example <caption><h7>通过json构造并返回一个新的SimpleLineSymbol对象</h7></caption>
*/
static fromJSON(json) {
json = defaultValue(json, {})
return new SimpleLineSymbol(json)
}
/**
* 克隆并返回新的符号对象
* @return {SimpleLineSymbol} 克隆后的新符号对象
*/
clone() {
return new SimpleLineSymbol(this.toJSON())
}
/**
* 导出为JSON对象
* @return {Object} JSON对像
*/
toJSON() {
const json = super.toJSON()
json.cap = this.cap
json.join = this.join
json.miterLimit = this.miterLimit
json.style = this.style
json.marker = this.marker ? this.marker.toJSON() : null
return json
}
}
Zondy.Symbol.SimpleLineSymbol = SimpleLineSymbol
export default SimpleLineSymbol