@vertigis/arcgis-extensions 52.0.3 → 52.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/support/_dxfConverters.js +1 -1
- package/data/support/_dxfFunctions.d.ts +6 -0
- package/data/support/_dxfFunctions.js +1 -1
- package/docs/html/assets/navigation.js +1 -1
- package/docs/html/assets/search.js +1 -1
- package/docs/html/functions/data_support__dxfFunctions.sanitizeSymbolWidth.html +3 -0
- package/docs/html/modules/data_support__dxfFunctions.html +1 -0
- package/docs/html/variables/version.version.html +1 -1
- package/mapping/PointCloudLayerExtension.d.ts +1 -0
- package/mapping/PointCloudLayerExtension.js +1 -1
- package/package.json +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"@arcgis/core/Color";import t from"@arcgis/core/Graphic";import o from"@arcgis/core/geometry/Point";import n from"@arcgis/core/layers/GeoJSONLayer";import r from"@arcgis/core/layers/GraphicsLayer";import s from"@arcgis/core/symbols/SimpleFillSymbol";import i from"@arcgis/core/symbols/SimpleLineSymbol";import a from"@arcgis/core/symbols/TextSymbol.js";import{project as l}from"../../utilities/geometry.js";import{delay as c}from"../../utilities/promise.js";import{getDefaultSymbol as x}from"../convert.js";import{normalizeFillStyle as d,normalizeLineOutline as y,intToRGB as p,deriveAnnotationMinScale as f}from"./_dxfFunctions.js";export class DxfToGeoJsonLineMapper{dxfContext;constructor(e){this.dxfContext=e,this.dxfContext.lastLineEnd=void 0,this.dxfContext.lastLineLayer=void 0}async processLine(e){const{vertices:t}=e;if(!t||t.length<2)return;const o=t[0],n=t[1];if(!o||!n)return;const[r,s]=await Promise.all([this.dxfContext.convertToSpatialReference(o.x,o.y),this.dxfContext.convertToSpatialReference(n.x,n.y)]),i=e.layer||"default",a={type:"Feature",geometry:{type:"LineString",coordinates:[r,s]},properties:{...e}};if(this.dxfContext.lastLineEnd&&this.dxfContext.lastLineLayer===i&&this._isSamePoint(this.dxfContext.lastLineEnd,r)){const e=this.dxfContext.lineFeatures.at(-1);if("LineString"===e?.geometry?.type){e.geometry.coordinates.push(s)}else this.dxfContext.lineFeatures.push(a)}else this.dxfContext.lineFeatures.push(a);this.dxfContext.lastLineEnd=s,this.dxfContext.lastLineLayer=i;const l=this.dxfContext.dxf.tables?.layer?.layers?.[i],c=e.color??l?.color??x(this.dxfContext.colorIndex++,"polyline").color,d=this._getLayerColor(e,c),y=`${e.layer}-${e.type}-${e.handle}`;this.dxfContext.renderer_Object_Line[y]={value:e.layer||"default",symbol:{type:"simple-line",color:d,width:e.lineweight||1.5,style:(()=>{const t=e.lineType&&this.dxfContext.dxf.tables?.lineType?.lineTypes?.[e.lineType];return"object"==typeof t&&t?.pattern?{pattern:t.pattern.map((e=>parseFloat(e)))}:"solid"})()}}}async processPolyline(t){const o=await this._getPolylineCoordinates(t),n=!!t.closed;n&&o.length>0&&this._ensureClosed(o);const r=this.dxfContext.dxf.tables?.layer?.layers?.[t.layer];let s;s=t.color,void 0!==s&&0!==s&&256!==s||(s=r?.color),void 0===s&&(s=x(this.dxfContext.colorIndex++,"polyline")?.color??new e("black"));const i="number"==typeof s?this.dxfContext.intToRGB(s):s,a=this._buildPolylineFeature(t,o,n,s);if(n)if(Array.isArray(i))this._applyPolygonRenderer(t,i,a);else if(i&&"object"==typeof i&&"r"in i){const e=[i.r,i.g,i.b,1];this._applyPolygonRenderer(t,e,a)}else{const o=x(this.dxfContext.colorIndex++,"polygon").color,n=o instanceof e?o.toRgba():o;this._applyPolygonRenderer(t,n,a)}else this._applyLineRenderer(t,a)}async processLWPolyline(e){const t=this._buildBulgeInterpolatedPoints(e),n=await this.dxfContext.projectMany(t.map((e=>new o({x:e.x,y:e.y,spatialReference:this.dxfContext.sourceSR})))),r=n[0],s=n[n.length-1],i=!!r&&!!s&&Math.abs(r[0]-s[0])<1e-6&&Math.abs(r[1]-s[1])<1e-6,a=Boolean(e.shape&&(e.closed||i)),l=this.dxfContext.dxf.tables?.layer?.layers?.[e.layer],c=e.color??l?.color??x(this.dxfContext.colorIndex++,"polyline").color,d=this._buildLWPolylineFeature(e,n,a,c);a?this._applyPolygonRenderer(e,this._getLayerColor(e,c),d):this._applyLineRenderer(e,d)}async processArc(e){const t=(e.startAngle??0)*(Math.PI/180),n=(e.endAngle??0)*(Math.PI/180),r=n-t,s=e.layer||"default",i=this.dxfContext.dxf.tables?.layer?.layers?.[s],a=Math.abs(n-t),c=Math.min(720,Math.max(48,Math.ceil(a*e.radius/2))),d=r/c,y=[];for(let n=0;n<=c;n++){const r=t+d*n,s=e.center.x+e.radius*Math.cos(r),i=e.center.y+e.radius*Math.sin(r);y.push(new o({x:s,y:i,spatialReference:this.dxfContext.sourceSR}))}const p=(await l(y,this.dxfContext.targetSR)).filter((e=>void 0!==e.longitude&&void 0!==e.latitude)).map((e=>[e.longitude,e.latitude])),f={type:"Feature",geometry:{type:"LineString",coordinates:p},properties:{...e}};if(this.dxfContext.lastLineEnd&&this.dxfContext.lastLineLayer===s&&p[0]&&this._isSamePoint(this.dxfContext.lastLineEnd,p[0])){const e=this.dxfContext.lineFeatures.at(-1);if("LineString"===e?.geometry?.type){e.geometry.coordinates.push(...p.slice(1))}else this.dxfContext.lineFeatures.push(f)}else this.dxfContext.lineFeatures.push(f);this.dxfContext.lastLineEnd=p.at(-1)??void 0,this.dxfContext.lastLineLayer=s;const h=`${e.layer}-${e.type}-${e.handle}`;this.dxfContext.renderer_Object_Line[h]={value:s,symbol:{type:"simple-line",color:this.dxfContext.intToRGB(Number(i?.color??x(this.dxfContext.colorIndex++,"polyline").color)),width:1.5,style:(()=>{const t=this.dxfContext.dxf.tables.lineType?.lineTypes?.[e.lineType],o="object"==typeof t&&void 0!==t?t:void 0;return o?.pattern?{pattern:o.pattern.map((e=>parseFloat(e)))}:"solid"})()}}}lineToGeoJSON(){this.dxfContext.lineFeatures=this._mergeConnectedLinesAndArcs(this.dxfContext.lineFeatures);const e={type:"FeatureCollection",features:this.dxfContext.lineFeatures},t=new Blob([JSON.stringify(e)],{type:"application/json"}),o=URL.createObjectURL(t),r=new n({url:o,id:`dxf-lines-${this.dxfContext.sanitizedFileName}-${(new Date).getTime()}`,title:`${this.dxfContext.fileName} - Lines`,visible:!0,labelsVisible:!0,renderer:{type:"unique-value",field:"layer",defaultSymbol:{type:"simple-line",color:x(this.dxfContext.colorIndex++,"polyline").color,width:1.5,style:"solid"},uniqueValueInfos:Object.values(this.dxfContext.renderer_Object_Line).map((e=>{const t="object"==typeof e.symbol.style?"dash":e.symbol.style??"solid";return{value:e.value,symbol:{type:"simple-line",color:e.symbol.color??x(this.dxfContext.colorIndex++,"polyline").color,width:e.symbol.width??1.5,style:t}}}))}});this.dxfContext.subLayers.push(r)}_getLayerColor(t,o){if("number"==typeof o)return this.dxfContext.intToRGB(o);if(Array.isArray(o))return o;if(o instanceof e)return o.toRgba();const n=x(this.dxfContext.colorIndex++,"polyline").color;if(n instanceof e)return n.toRgba();if(Array.isArray(n))return n;if("number"==typeof n)return this.dxfContext.intToRGB(n);const r=x(this.dxfContext.colorIndex++,"polyline").color;return r instanceof e?r.toRgba():Array.isArray(r)?r:[0,0,0,1]}_interpolateBulge(e,t,o,n=16){if(Math.abs(o)<1e-9)return[[t.x,t.y]];const r=t.x-e.x,s=t.y-e.y,i=Math.hypot(r,s);if(i<1e-9)return[[t.x,t.y]];const a=4*Math.atan(o),l=Math.abs(i/(2*Math.sin(a/2))),c=e.x+r/2,x=e.y+s/2,d=Math.sqrt(Math.max(0,l*l-i/2*(i/2))),y=c+d*(-s/i*Math.sign(o)),p=x+d*(r/i*Math.sign(o)),f=Math.atan2(e.y-p,e.x-y),h=[],u=a/n;for(let e=1;e<=n;e++){const t=f+e*u;h.push([y+l*Math.cos(t),p+l*Math.sin(t)])}return h}_buildBulgeInterpolatedPoints(e){const t=[];e.vertices.length>0&&e.vertices[0]&&t.push({x:e.vertices[0].x,y:e.vertices[0].y});for(let o=0;o<e.vertices.length-1;o++){const n=e.vertices[o],r=e.vertices[o+1];if(!n||!r)continue;const s=n.bulge??0,i=this._interpolateBulge(n,r,s,16);for(const[e,o]of i)t.push({x:e,y:o})}if((e.closed||e.shape)&&e.vertices.length>1){const o=e.vertices[0],n=e.vertices[e.vertices.length-1];if(o&&n&&(o.x!==n.x||o.y!==n.y)){const e=n.bulge??0,r=this._interpolateBulge(n,o,e,16);for(const[e,o]of r)t.push({x:e,y:o})}}return t}_buildLWPolylineFeature(e,t,o,n){return{type:"Feature",geometry:o?{type:"Polygon",coordinates:[t]}:{type:"LineString",coordinates:t},properties:{...e,color:n}}}async _getPolylineCoordinates(e){const t=e.vertices.map((e=>new o({x:e.x,y:e.y,spatialReference:this.dxfContext.sourceSR})));return(await l(t,this.dxfContext.targetSR)).filter((e=>!!e&&void 0!==e.longitude&&void 0!==e.latitude)).map((e=>[e.longitude,e.latitude]))}_ensureClosed(e){const t=e[0],o=e[e.length-1];t&&o&&(t[0]!==o[0]||t[1]!==o[1])&&e.push(t)}_buildPolylineFeature(e,t,o,n){return{type:"Feature",geometry:o?{type:"Polygon",coordinates:[t]}:{type:"LineString",coordinates:t},properties:{...e,color:n}}}_applyPolygonRenderer(t,o,n){this.dxfContext.polygonFeatures.push(n);const r=`${t.layer}-${t.type}-${t.handle}`,s=o instanceof e?o.toRgba():o;this.dxfContext.renderer_Object_Polygon[r]={value:t.layer||"default",symbol:{type:"simple-fill",style:t.closed?"solid":"none",color:s,outline:{color:s,width:t.width??1.5}}}}_applyLineRenderer(t,o){this.dxfContext.lineFeatures.push(o);const n=o.properties?.color;let r;if(n instanceof e)r=n.toRgba();else if(Array.isArray(n)&&n.every((e=>"number"==typeof e)))r=n;else{const e="number"==typeof n?n:0;r=this.dxfContext.intToRGB(e)}const s=`${t.layer}-${t.type}-${t.handle}`;this.dxfContext.renderer_Object_Line[s]={value:t.layer||"default",symbol:{type:"simple-line",color:r,width:t.lineweight||1.5,style:(()=>{const e=t.lineType&&this.dxfContext.dxf.tables.lineType?.lineTypes[t.lineType],o="object"==typeof e&&void 0!==e?e:void 0;return mapDXFLineTypeToEsri(t.lineType,o)})()}}}_isSamePoint(e,t,o=1e-6){return Math.abs(e[0]-t[0])<=o&&Math.abs(e[1]-t[1])<=o}_mergeConnectedLinesAndArcs(e){const t=[];for(const o of e){const e=t[t.length-1],n="LineString"===e?.geometry?.type,r="LineString"===o?.geometry?.type,s=n?e.geometry.coordinates:void 0,i=r?o.geometry.coordinates:void 0,a=s?.at(-1),l=i?.at(0);e&&a&&l&&e.properties?.layer===o.properties?.layer&&this._isSamePoint(a,l)?e.geometry.coordinates.push(...o.geometry.coordinates.slice(1)):t.push(o)}return t}}export class DxfToGeoJsonPolygonMapper{dxfContext;constructor(e){this.dxfContext=e}async processSolid(e){const t=e.points.map((e=>new o({x:e.x,y:e.y,spatialReference:this.dxfContext.sourceSR}))),n=(await l(t,this.dxfContext.targetSR)).filter((e=>!!e&&void 0!==e.longitude&&void 0!==e.latitude)).map((e=>[e.longitude,e.latitude]));if(n.length>0){const e=n[0],t=n[n.length-1];e[0]===t[0]&&e[1]===t[1]||n.push(e)}const r=this.dxfContext.dxf.tables?.layer?.layers?.[e.layer],s={type:"Feature",geometry:{type:"Polygon",coordinates:[n]},properties:{...e}};this.dxfContext.polygonFeatures.push(s);const i=r?.color??x(this.dxfContext.colorIndex++,"polygon").color,a=this.dxfContext.intToRGB(Number(i??0)),c=`${e.layer}-${e.type}-${e.handle}`;this.dxfContext.renderer_Object_Polygon[c]={value:e.layer||"default",symbol:{type:"simple-fill",style:"solid",color:[...a.slice(0,3),.5],outline:{color:this.dxfContext.intToRGB(Number(i??0)),width:1.5}}}}async processCircle(e){const t=e.center.x,n=e.center.y,r=Math.min(64,Math.max(16,Math.ceil(e.radius/5))),s=2*Math.PI/r,i=[];for(let a=0;a<=r;a++){const r=a*s,l=t+e.radius*Math.cos(r),c=n+e.radius*Math.sin(r);i.push(new o({x:l,y:c,spatialReference:this.dxfContext.sourceSR}))}const a=(await this.dxfContext.projectMany(i)).map((e=>[e[0],e[1]])),l=a[0],c=a[a.length-1];l&&c&&(l[0]!==c[0]||l[1]!==c[1])&&a.push(l);const d={type:"Feature",geometry:{type:"Polygon",coordinates:[a]},properties:{...e}};this.dxfContext.polygonFeatures.push(d);const y=this.dxfContext.dxf.tables?.layer?.layers?.[e.layer||"default"],p=e.color??y?.color??x(this.dxfContext.colorIndex++,"polygon").color;let f;f=Array.isArray(p)?p:"object"==typeof p&&"toRgba"in p?p.toRgba():this.dxfContext.intToRGB(p);const h=`${e.layer}-${e.type}-${e.handle}`;this.dxfContext.renderer_Object_Polygon[h]={value:e.layer||"default",symbol:{type:"simple-fill",style:"solid",color:f,outline:{color:f}}}}polygonToGeoJSON(){const t={type:"FeatureCollection",features:this.dxfContext.polygonFeatures},o=new Blob([JSON.stringify(t)],{type:"application/json"}),r=URL.createObjectURL(o);this.dxfContext.subLayers.push(new n({url:r,id:`dxf-polygons-${this.dxfContext.sanitizedFileName}-${(new Date).getTime()}`,title:`${this.dxfContext.fileName} - Polygons`,visible:!0,labelsVisible:!0,renderer:{type:"unique-value",field:"layer",defaultSymbol:(()=>{let e;const t=x(this.dxfContext.colorIndex++,"polygon");return t?.toJSON&&(e=t.toJSON()),{type:"simple-fill",style:d(e?.style),color:e?.color??x(this.dxfContext.colorIndex++,"polygon").color,outline:y(e?.outline)}})(),uniqueValueInfos:Object.values(this.dxfContext.renderer_Object_Polygon).map((t=>{const o=new i({color:t.symbol.outline?.color?new e(t.symbol.outline.color):new e(t.symbol.color??x(this.dxfContext.colorIndex++,"polygon").color),width:t.symbol.outline?.width??1.5}),n=t.symbol.color?[...t.symbol.color.slice(0,3),.3]:x(this.dxfContext.colorIndex++,"polygon").color,r=new s({style:"solid",color:new e(n),outline:o});return{value:t.value,symbol:r}}))}}))}}export class DxfToGeoJsonTextMapper{dxfContext;constructor(e){this.dxfContext=e}async processText(e){if(e.block)return;const[t,o]=await this.dxfContext.convertToSpatialReference(e.startPoint.x,e.startPoint.y);this.dxfContext.textFeatures.push({type:"Feature",geometry:{type:"Point",coordinates:[t,o]},properties:{...e}})}async processMText(e){const[t,o]=await this.dxfContext.convertToSpatialReference(e.position.x,e.position.y);this.dxfContext.textFeatures.push({type:"Feature",geometry:{type:"Point",coordinates:[t,o]},properties:{...e}})}async processAttDef(e){const[t,o]=await this.dxfContext.convertToSpatialReference(e.startPoint.x,e.startPoint.y),n=e.endPoint??e.startPoint,[r,s]=await this.dxfContext.convertToSpatialReference(n.x,n.y);this.dxfContext.textFeatures.push({type:"Feature",geometry:{type:"Point",coordinates:[t,o]},properties:{...e,startPoint:{x:t,y:o},endPoint:{x:r,y:s}}})}AnnotationToGeoJSON(){const e={1:"above-left",2:"above-center",3:"above-right",4:"center-left",5:"center-center",6:"center-right",7:"below-left",8:"below-center",9:"below-right"},t=new Map([[0,"left"],[2,"right"],[4,"center"]]),o=new Map([[0,"baseline"],[1,"bottom"],[2,"middle"],[3,"top"]]),n=this.dxfContext.textFeatures.map((n=>this._createTextGraphic(n,e,t,o))).filter((e=>null!==e)),s=new r({title:`${this.dxfContext.fileName??"dxf"} - Annotations`,id:`dxf-annotations-${this.dxfContext.sanitizedFileName??"dxf"}-${(new Date).getTime()}`,visible:!0,graphics:n});this.dxfContext.subLayers.push(s);const i=this.getMaximumFontSize(n);s.minScale=f(s.fullExtent??void 0,n.length,i),s.maxScale=0}getMaximumFontSize(e){let t=12;return e.forEach((e=>{if(!e)return;const o=e.attributes?.fontSize;"number"==typeof o&&Number.isFinite(o)&&(t=Math.max(t,o))})),t+2}_createTextGraphic(e,n,r,s){if("Point"!==e.geometry.type)return;const i=e.properties??{},l=this._getTextString(i);if(!l)return;const c=e.geometry.coordinates,x=new o({x:c[0],y:c[1],spatialReference:{wkid:4326}}),d=this._getTextColor(i),y=this._getFontSize(i),p=this._getRotation(i),{xoffset:f,yoffset:h}=this._getOffsets(i),{labelPlacement:u,horizontal:m,vertical:g}=this._getAlignment(i,n,r,s);return new t({geometry:x,symbol:new a({text:l,color:d,angle:p,xoffset:f,yoffset:h,horizontalAlignment:m,verticalAlignment:g,font:{family:"Arial",size:y}}),attributes:{...i,text:l,rotation:p,fontSize:y,horizontal:m,vertical:g,xoffset:f,yoffset:h,labelPlacement:u},popupTemplate:{title:"{text}",content:[{type:"fields",fieldInfos:Object.keys(i).map((e=>({fieldName:e,label:e})))}]}})}_getTextString(e){if(!e)return"";const t=String(e.text??"").trim(),o=String(e.prompt??"").trim(),n=t||o;return n||""}_getTextColor(e){const t=String(e?.layer||"0"),o=e?.color??this.dxfContext.dxf.tables?.layer?.layers?.[t]?.color??x(this.dxfContext.colorIndex++,"point").color;return this.dxfContext.intToRGB(o)}_getFontSize(e){let t=4*(e?.height??e?.textHeight??3);return t=Math.max(12,Math.min(t,30)),t}_getRotation(e){const t=String(e?.type??"").toUpperCase(),o=Number(e?.rotation??0);if("TEXT"===t)return-o;if("MTEXT"===t)return-o;if("ATTDEF"===t||"ATTRIB"===t){if(0!==o)return-o;if(e?.startPoint&&e?.endPoint){const{x:t,y:o}=e.startPoint,{x:n,y:r}=e.endPoint;if(t!==n||o!==r)return-180*Math.atan2(r-o,n-t)/Math.PI}return-o}if(e?.startPoint&&e?.endPoint){const{x:t,y:o}=e.startPoint,{x:n,y:r}=e.endPoint;return-180*Math.atan2(r-o,n-t)/Math.PI}return-o}_getOffsets(e){return{xoffset:Number(e?.xScale??0),yoffset:Number(e?.yScale??0)}}_getAlignment(e,t,o,n){return{labelPlacement:t[Number(e?.attachmentPoint??1)]??"above-left",horizontal:o.get(Number(e?.halign??e?.horizontalJustification))??"left",vertical:n.get(Number(e?.valign??e?.verticalJustification))??"baseline"}}}export class DxfToGeoJsonInsertBlockMapper{dxfContext;constructor(e){this.dxfContext=e}async processInsertFunction(e){if(!e.name||!this.dxfContext.dxf.blocks?.[e.name])return;const t=this.dxfContext.dxf.blocks[e.name],o=e.rotation||0,n={x:e.xScale??1,y:e.yScale??1,z:e.zScale??1},r=e.position||{x:0,y:0},[s,i]=await this.dxfContext.convertToSpatialReference(r.x,r.y);this._createInsertPointFeature(e,t,o,s,i);const a=(e.layer||"default").toString();this.dxfContext.renderer_Object_Point[a]=this._createLayerSymbol(a,e),await this._processBlockEntities(t,e,o,n,r)}async processPoint(t){const[o,n]=await this.dxfContext.convertToSpatialReference(t.position.x,t.position.y),r=this.dxfContext.dxf.header?.$PDMODE||0;let s="circle";if(32&~r)if(64&~r)switch(7&r){case 0:case 1:s="circle";break;case 2:s="cross";break;case 3:s="x"}else s="square";else s="circle";const i=(t.layer||"default").toString(),a=this.dxfContext.dxf.tables?.layer?.layers?.[i],l=t.color??a?.color??x(this.dxfContext.colorIndex++,"point").color,c=l instanceof e?l.toRgba():Array.isArray(l)?l:this.dxfContext.intToRGB(Number(l??0));this.dxfContext.pointFeatures.push({type:"Feature",geometry:{type:"Point",coordinates:[o,n]},properties:{...t}}),this.dxfContext.renderer_Object_Point[i]={value:i,symbol:{type:"simple-marker",style:s,size:this.dxfContext.dxf.header?.$PDSIZE||5,color:c}}}async processInsert(e){const t={...e};t.xScale=e.xScale??1,t.yScale=e.yScale??1,t.zScale=e.zScale??1,t.rotation=e.rotation??0,await this.processInsertFunction(t)}pointToGeoJSON(){const e={type:"FeatureCollection",features:this.dxfContext.pointFeatures},t=new Blob([JSON.stringify(e)],{type:"application/json"}),o=URL.createObjectURL(t),r=new n({url:o,id:`dxf-points-${this.dxfContext.sanitizedFileName}-${(new Date).getTime()}`,title:`${this.dxfContext.fileName} - Points`,labelsVisible:!0,renderer:{type:"unique-value",field:"layer",defaultSymbol:{type:"simple-marker",style:"circle",color:x(this.dxfContext.colorIndex++,"point").color,size:6},uniqueValueInfos:Object.values(this.dxfContext.renderer_Object_Point).map((e=>({value:e.value,symbol:{type:"simple-marker",style:"circle",size:e.symbol?.size||6,color:e.symbol.color??x(this.dxfContext.colorIndex++,"point").color}})))}});this.dxfContext.subLayers.push(r)}_createInsertPointFeature(e,t,o,n,r){this.dxfContext.pointFeatures.push({type:"Feature",geometry:{type:"Point",coordinates:[n,r]},properties:{layer:e.layer||"default",type:"INSERT",blockName:e.name,rotation:o,blockType:t?.name??e.name,color:e.color??this.dxfContext.dxf.tables?.layer?.layers?.[e.layer]?.color??x(this.dxfContext.colorIndex++,"polyline").color,text:t?.name??e.name}})}_createLayerSymbol(e,t){return{value:e,symbol:{type:"simple-marker",style:"circle",size:5,color:this.dxfContext.intToRGB(this.dxfContext.dxf.tables?.layer?.layers?.[t.layer]?.color??0)}}}_normalizeBlockEntities(e){const t=e.entities;return Array.isArray(t)?t:void 0===t?[]:"function"==typeof t[Symbol.iterator]?Array.from(t):Array.isArray(t.entities)?t.entities:"object"==typeof t&&void 0!==t?Object.values(t):[]}async _processBlockEntities(e,t,o,n,r){const s=this._normalizeBlockEntities(e);if(0!==s.length)for(const e of s){if(!e||"object"!=typeof e)continue;const s=e.type;if("BLOCK"===s||"ENDBLK"===s)continue;const i=JSON.parse(JSON.stringify(e));if(i.layer=e.layer&&"0"!==e.layer?e.layer:String(t.layer),0===e.color)i.color=t.color;else if(256===e.color||void 0===e.color){const e=this.dxfContext.dxf.tables?.layer?.layers?.[String(t.layer)];i.color=e?.color}try{this._transformEntityGeometry(i,n,o,r),this._adjustEntityAttributes(i,n,o,t.name),await this.dxfContext.dxfEntities([i])}catch{continue}}}_transformEntityGeometry(e,t,o,n){const r=o*Math.PI/180,s=(e,o)=>({x:e*t.x*Math.cos(r)-o*t.y*Math.sin(r)+n.x,y:e*t.x*Math.sin(r)+o*t.y*Math.cos(r)+n.y});e.vertices&&(e.vertices=e.vertices.map((e=>{const t=s(e.x,e.y);return{x:t.x,y:t.y,bulge:e.bulge}}))),e.center&&(e.center=s(e.center.x,e.center.y)),e.position&&(e.position=s(e.position.x,e.position.y))}_adjustEntityAttributes(e,t,o,n){e.radius&&(e.radius*=Math.max(t.x,t.y)),e.height&&(e.height*=t.y),void 0!==e.rotation&&(e.rotation=(e.rotation+o)%360),e.blockName=String(n)}}export function mapDXFLineTypeToEsri(e,t){if(!e)return"solid";const o=e.toUpperCase(),n=function(e,t){if(!e)return;const o=e.toUpperCase().trim(),n={BYLAYER:"solid",BYBLOCK:"solid",CONTINUOUS:"solid",HIDDEN:"dash",DASHED:"dash",DASHEDX2:"dash",DASHED2:"dash",CENTER:"dash-dot",CENTERX2:"dash-dot",CENTER2:"dash-dot",DASHDOT:"dash-dot",DOTTED:"dot",DIVIDE:"short-dash",DIVIDEX2:"short-dash-dot",DIVIDE2:"short-dash-dot"};if(n[o])return n[o];if(t?.length){const e=Math.abs(t[0]??0),o=Math.abs(t[1]??0);if(2===t.length)return e<8&&o<6?"short-dash":e>=8&&e<=15&&o>=6&&o<=15?"dash":"long-dash";if(4===t.length)return e<6&&o<6?"short-dash-dot":e>=6&&e<=15&&o>=6&&o<=15?"dash-dot":"long-dash-dot"}return}(o,t?.pattern?.map((e=>parseFloat(e))));if(n)return n;const r=function(e){const t=e.toUpperCase();return t.includes("LONG")?"long-dash":t.includes("DOUBLE")?"long-dash-dot":t.includes("PHANTOM")?"dash-dot":void 0}(o);if(r)return r;const s=function(e){if(e?.pattern&&Array.isArray(e.pattern)){const t=e.pattern,o=t.some((e=>parseFloat(e)>.2)),n=t.some((e=>0===parseFloat(e)));return o&&!n?"dash":!o&&n?"dot":o&&n?"dash-dot":"solid"}return}(t);return s||"solid"}export class DxfEntityProcessor{dxfContext;entityHandlers;constructor(e,t,o={}){const n={dxf:{header:{},tables:{viewPort:{handle:"",ownerHandle:"",viewPorts:[]},lineType:{handle:"",ownerHandle:"",lineTypes:{}},layer:{handle:"",ownerHandle:"",layers:{}}},entities:[],blocks:{}},renderer_Object_Point:{},renderer_Object_Line:{},renderer_Object_Polygon:{},sourceSR:e,targetSR:t,subLayers:[],pointFeatures:[],lineFeatures:[],polygonFeatures:[],textFeatures:[],async dxfEntities(){},convertToSpatialReference:async()=>[0,0],projectMany:async()=>[],intToRGB:p,colorIndex:0,...o};n.dxfToGeoJsonLineMapper=new DxfToGeoJsonLineMapper(n),n.dxfToGeoJsonPolygonMapper=new DxfToGeoJsonPolygonMapper(n),n.dxfToGeoJsonTextMapper=new DxfToGeoJsonTextMapper(n),n.dxfToGeoJsonInsertBlockMapper=new DxfToGeoJsonInsertBlockMapper(n),this.dxfContext=n,this.dxfContext.convertToSpatialReference=(e,t)=>this.convertToSpatialReference(e,t),this.dxfContext.projectMany=e=>this.projectMany(e),this.dxfContext.dxfEntities=async e=>this.process(e),this.entityHandlers={POINT:e=>this.dxfContext.dxfToGeoJsonInsertBlockMapper.processPoint(e),INSERT:e=>this.dxfContext.dxfToGeoJsonInsertBlockMapper.processInsert(e),LINE:async e=>{e.vertices?.length>=2&&await this.dxfContext.dxfToGeoJsonLineMapper.processLine(e)},ARC:async e=>{e.center&&void 0!==e.radius&&await this.dxfContext.dxfToGeoJsonLineMapper.processArc(e)},LWPOLYLINE:async e=>{Array.isArray(e.vertices)&&await this.dxfContext.dxfToGeoJsonLineMapper.processLWPolyline(e)},POLYLINE:async e=>{Array.isArray(e.vertices)&&await this.dxfContext.dxfToGeoJsonLineMapper.processPolyline(e)},SOLID:async e=>{e.points.length>=3&&await this.dxfContext.dxfToGeoJsonPolygonMapper.processSolid(e)},CIRCLE:async e=>{e.center&&e.radius&&await this.dxfContext.dxfToGeoJsonPolygonMapper.processCircle(e)},TEXT:e=>this.dxfContext.dxfToGeoJsonTextMapper.processText(e),MTEXT:async e=>{e.position&&await this.dxfContext.dxfToGeoJsonTextMapper.processMText(e)},ATTDEF:async e=>{e.startPoint&&await this.dxfContext.dxfToGeoJsonTextMapper.processAttDef(e)}}}getContext(){return this.dxfContext}async convertToSpatialReference(e,t){const n=new o({x:e,y:t,spatialReference:this.dxfContext.sourceSR}),[r]=await l([n],this.dxfContext.targetSR);return r?[r.longitude??0,r.latitude??0]:[0,0]}async projectMany(e){return(await l(e,this.dxfContext.targetSR)).map(((t,o)=>{const n=e[o];return[t?.longitude??n.x,t?.latitude??n.y]}))}async process(e){const t=Array.isArray(e)?e:[e];for(const e of t){if(!e||"BLOCK"===e.type||"ENDBLK"===e.type)continue;const t=this.entityHandlers[e.type];t&&await t(e)}}async processAll(){if(this.dxfContext.dxf.entities?.length>0){const e=50;for(let t=0;t<this.dxfContext.dxf.entities.length;t+=e){const o=this.dxfContext.dxf.entities.slice(t,t+e);await c(),await this.process(o)}}return await Promise.all([this.dxfContext.polygonFeatures.length>0&&this.dxfContext.dxfToGeoJsonPolygonMapper.polygonToGeoJSON(),this.dxfContext.lineFeatures.length>0&&this.dxfContext.dxfToGeoJsonLineMapper.lineToGeoJSON(),this.dxfContext.pointFeatures.length>0&&this.dxfContext.dxfToGeoJsonInsertBlockMapper.pointToGeoJSON(),this.dxfContext.textFeatures.length>0&&this.dxfContext.dxfToGeoJsonTextMapper.AnnotationToGeoJSON()].filter(Boolean)),this.dxfContext.subLayers}}
|
|
1
|
+
import e from"@arcgis/core/Color";import t from"@arcgis/core/Graphic";import o from"@arcgis/core/geometry/Point";import n from"@arcgis/core/layers/GeoJSONLayer";import r from"@arcgis/core/layers/GraphicsLayer";import s from"@arcgis/core/symbols/SimpleFillSymbol";import i from"@arcgis/core/symbols/SimpleLineSymbol";import a from"@arcgis/core/symbols/TextSymbol.js";import{project as l}from"../../utilities/geometry.js";import{delay as c}from"../../utilities/promise.js";import{getDefaultSymbol as x}from"../convert.js";import{normalizeFillStyle as d,normalizeLineOutline as y,intToRGB as p,deriveAnnotationMinScale as f,sanitizeSymbolWidth as h}from"./_dxfFunctions.js";export class DxfToGeoJsonLineMapper{dxfContext;constructor(e){this.dxfContext=e,this.dxfContext.lastLineEnd=void 0,this.dxfContext.lastLineLayer=void 0}async processLine(e){const{vertices:t}=e;if(!t||t.length<2)return;const o=t[0],n=t[1];if(!o||!n)return;const[r,s]=await Promise.all([this.dxfContext.convertToSpatialReference(o.x,o.y),this.dxfContext.convertToSpatialReference(n.x,n.y)]),i=e.layer||"default",a={type:"Feature",geometry:{type:"LineString",coordinates:[r,s]},properties:{...e}};if(this.dxfContext.lastLineEnd&&this.dxfContext.lastLineLayer===i&&this._isSamePoint(this.dxfContext.lastLineEnd,r)){const e=this.dxfContext.lineFeatures.at(-1);if("LineString"===e?.geometry?.type){e.geometry.coordinates.push(s)}else this.dxfContext.lineFeatures.push(a)}else this.dxfContext.lineFeatures.push(a);this.dxfContext.lastLineEnd=s,this.dxfContext.lastLineLayer=i;const l=this.dxfContext.dxf.tables?.layer?.layers?.[i],c=e.color??l?.color??x(this.dxfContext.colorIndex++,"polyline").color,d=this._getLayerColor(e,c),y=`${e.layer}-${e.type}-${e.handle}`;this.dxfContext.renderer_Object_Line[y]={value:e.layer||"default",symbol:{type:"simple-line",color:d,width:e.lineweight||1.5,style:(()=>{const t=e.lineType&&this.dxfContext.dxf.tables?.lineType?.lineTypes?.[e.lineType];return"object"==typeof t&&t?.pattern?{pattern:t.pattern.map((e=>parseFloat(e)))}:"solid"})()}}}async processPolyline(t){const o=await this._getPolylineCoordinates(t),n=!!t.closed;n&&o.length>0&&this._ensureClosed(o);const r=this.dxfContext.dxf.tables?.layer?.layers?.[t.layer];let s;s=t.color,void 0!==s&&0!==s&&256!==s||(s=r?.color),void 0===s&&(s=x(this.dxfContext.colorIndex++,"polyline")?.color??new e("black"));const i="number"==typeof s?this.dxfContext.intToRGB(s):s,a=this._buildPolylineFeature(t,o,n,s);if(n)if(Array.isArray(i))this._applyPolygonRenderer(t,i,a);else if(i&&"object"==typeof i&&"r"in i){const e=[i.r,i.g,i.b,1];this._applyPolygonRenderer(t,e,a)}else{const o=x(this.dxfContext.colorIndex++,"polygon").color,n=o instanceof e?o.toRgba():o;this._applyPolygonRenderer(t,n,a)}else this._applyLineRenderer(t,a)}async processLWPolyline(e){const t=this._buildBulgeInterpolatedPoints(e),n=await this.dxfContext.projectMany(t.map((e=>new o({x:e.x,y:e.y,spatialReference:this.dxfContext.sourceSR})))),r=n[0],s=n[n.length-1],i=!!r&&!!s&&Math.abs(r[0]-s[0])<1e-6&&Math.abs(r[1]-s[1])<1e-6,a=Boolean(e.shape&&(e.closed||i)),l=this.dxfContext.dxf.tables?.layer?.layers?.[e.layer],c=e.color??l?.color??x(this.dxfContext.colorIndex++,"polyline").color,d=this._buildLWPolylineFeature(e,n,a,c);a?this._applyPolygonRenderer(e,this._getLayerColor(e,c),d):this._applyLineRenderer(e,d)}async processArc(e){const t=(e.startAngle??0)*(Math.PI/180),n=(e.endAngle??0)*(Math.PI/180),r=n-t,s=e.layer||"default",i=this.dxfContext.dxf.tables?.layer?.layers?.[s],a=Math.abs(n-t),c=Math.min(720,Math.max(48,Math.ceil(a*e.radius/2))),d=r/c,y=[];for(let n=0;n<=c;n++){const r=t+d*n,s=e.center.x+e.radius*Math.cos(r),i=e.center.y+e.radius*Math.sin(r);y.push(new o({x:s,y:i,spatialReference:this.dxfContext.sourceSR}))}const p=(await l(y,this.dxfContext.targetSR)).filter((e=>void 0!==e.longitude&&void 0!==e.latitude)).map((e=>[e.longitude,e.latitude])),f={type:"Feature",geometry:{type:"LineString",coordinates:p},properties:{...e}};if(this.dxfContext.lastLineEnd&&this.dxfContext.lastLineLayer===s&&p[0]&&this._isSamePoint(this.dxfContext.lastLineEnd,p[0])){const e=this.dxfContext.lineFeatures.at(-1);if("LineString"===e?.geometry?.type){e.geometry.coordinates.push(...p.slice(1))}else this.dxfContext.lineFeatures.push(f)}else this.dxfContext.lineFeatures.push(f);this.dxfContext.lastLineEnd=p.at(-1)??void 0,this.dxfContext.lastLineLayer=s;const h=`${e.layer}-${e.type}-${e.handle}`;this.dxfContext.renderer_Object_Line[h]={value:s,symbol:{type:"simple-line",color:this.dxfContext.intToRGB(Number(i?.color??x(this.dxfContext.colorIndex++,"polyline").color)),width:1.5,style:(()=>{const t=this.dxfContext.dxf.tables.lineType?.lineTypes?.[e.lineType],o="object"==typeof t&&void 0!==t?t:void 0;return o?.pattern?{pattern:o.pattern.map((e=>parseFloat(e)))}:"solid"})()}}}lineToGeoJSON(){this.dxfContext.lineFeatures=this._mergeConnectedLinesAndArcs(this.dxfContext.lineFeatures);const e={type:"FeatureCollection",features:this.dxfContext.lineFeatures},t=new Blob([JSON.stringify(e)],{type:"application/json"}),o=URL.createObjectURL(t),r=new n({url:o,id:`dxf-lines-${this.dxfContext.sanitizedFileName}-${(new Date).getTime()}`,title:`${this.dxfContext.fileName} - Lines`,visible:!0,labelsVisible:!0,renderer:{type:"unique-value",field:"layer",defaultSymbol:{type:"simple-line",color:x(this.dxfContext.colorIndex++,"polyline").color,width:1.5,style:"solid"},uniqueValueInfos:Object.values(this.dxfContext.renderer_Object_Line).map((e=>{const t="object"==typeof e.symbol.style?"dash":e.symbol.style??"solid";return{value:e.value,symbol:{type:"simple-line",color:e.symbol.color??x(this.dxfContext.colorIndex++,"polyline").color,width:h(e.symbol?.width),style:t}}}))}});this.dxfContext.subLayers.push(r)}_getLayerColor(t,o){if("number"==typeof o)return this.dxfContext.intToRGB(o);if(Array.isArray(o))return o;if(o instanceof e)return o.toRgba();const n=x(this.dxfContext.colorIndex++,"polyline").color;if(n instanceof e)return n.toRgba();if(Array.isArray(n))return n;if("number"==typeof n)return this.dxfContext.intToRGB(n);const r=x(this.dxfContext.colorIndex++,"polyline").color;return r instanceof e?r.toRgba():Array.isArray(r)?r:[0,0,0,1]}_interpolateBulge(e,t,o,n=16){if(Math.abs(o)<1e-9)return[[t.x,t.y]];const r=t.x-e.x,s=t.y-e.y,i=Math.hypot(r,s);if(i<1e-9)return[[t.x,t.y]];const a=4*Math.atan(o),l=Math.abs(i/(2*Math.sin(a/2))),c=e.x+r/2,x=e.y+s/2,d=Math.sqrt(Math.max(0,l*l-i/2*(i/2))),y=c+d*(-s/i*Math.sign(o)),p=x+d*(r/i*Math.sign(o)),f=Math.atan2(e.y-p,e.x-y),h=[],u=a/n;for(let e=1;e<=n;e++){const t=f+e*u;h.push([y+l*Math.cos(t),p+l*Math.sin(t)])}return h}_buildBulgeInterpolatedPoints(e){const t=[];e.vertices.length>0&&e.vertices[0]&&t.push({x:e.vertices[0].x,y:e.vertices[0].y});for(let o=0;o<e.vertices.length-1;o++){const n=e.vertices[o],r=e.vertices[o+1];if(!n||!r)continue;const s=n.bulge??0,i=this._interpolateBulge(n,r,s,16);for(const[e,o]of i)t.push({x:e,y:o})}if((e.closed||e.shape)&&e.vertices.length>1){const o=e.vertices[0],n=e.vertices[e.vertices.length-1];if(o&&n&&(o.x!==n.x||o.y!==n.y)){const e=n.bulge??0,r=this._interpolateBulge(n,o,e,16);for(const[e,o]of r)t.push({x:e,y:o})}}return t}_buildLWPolylineFeature(e,t,o,n){return{type:"Feature",geometry:o?{type:"Polygon",coordinates:[t]}:{type:"LineString",coordinates:t},properties:{...e,color:n}}}async _getPolylineCoordinates(e){const t=e.vertices.map((e=>new o({x:e.x,y:e.y,spatialReference:this.dxfContext.sourceSR})));return(await l(t,this.dxfContext.targetSR)).filter((e=>!!e&&void 0!==e.longitude&&void 0!==e.latitude)).map((e=>[e.longitude,e.latitude]))}_ensureClosed(e){const t=e[0],o=e[e.length-1];t&&o&&(t[0]!==o[0]||t[1]!==o[1])&&e.push(t)}_buildPolylineFeature(e,t,o,n){return{type:"Feature",geometry:o?{type:"Polygon",coordinates:[t]}:{type:"LineString",coordinates:t},properties:{...e,color:n}}}_applyPolygonRenderer(t,o,n){this.dxfContext.polygonFeatures.push(n);const r=`${t.layer}-${t.type}-${t.handle}`,s=o instanceof e?o.toRgba():o;this.dxfContext.renderer_Object_Polygon[r]={value:t.layer||"default",symbol:{type:"simple-fill",style:t.closed?"solid":"none",color:s,outline:{color:s,width:t.width??1.5}}}}_applyLineRenderer(t,o){this.dxfContext.lineFeatures.push(o);const n=o.properties?.color;let r;if(n instanceof e)r=n.toRgba();else if(Array.isArray(n)&&n.every((e=>"number"==typeof e)))r=n;else{const e="number"==typeof n?n:0;r=this.dxfContext.intToRGB(e)}const s=`${t.layer}-${t.type}-${t.handle}`;this.dxfContext.renderer_Object_Line[s]={value:t.layer||"default",symbol:{type:"simple-line",color:r,width:t.lineweight||1.5,style:(()=>{const e=t.lineType&&this.dxfContext.dxf.tables.lineType?.lineTypes[t.lineType],o="object"==typeof e&&void 0!==e?e:void 0;return mapDXFLineTypeToEsri(t.lineType,o)})()}}}_isSamePoint(e,t,o=1e-6){return Math.abs(e[0]-t[0])<=o&&Math.abs(e[1]-t[1])<=o}_mergeConnectedLinesAndArcs(e){const t=[];for(const o of e){const e=t[t.length-1],n="LineString"===e?.geometry?.type,r="LineString"===o?.geometry?.type,s=n?e.geometry.coordinates:void 0,i=r?o.geometry.coordinates:void 0,a=s?.at(-1),l=i?.at(0);e&&a&&l&&e.properties?.layer===o.properties?.layer&&this._isSamePoint(a,l)?e.geometry.coordinates.push(...o.geometry.coordinates.slice(1)):t.push(o)}return t}}export class DxfToGeoJsonPolygonMapper{dxfContext;constructor(e){this.dxfContext=e}async processSolid(e){const t=e.points.map((e=>new o({x:e.x,y:e.y,spatialReference:this.dxfContext.sourceSR}))),n=(await l(t,this.dxfContext.targetSR)).filter((e=>!!e&&void 0!==e.longitude&&void 0!==e.latitude)).map((e=>[e.longitude,e.latitude]));if(n.length>0){const e=n[0],t=n[n.length-1];e[0]===t[0]&&e[1]===t[1]||n.push(e)}const r=this.dxfContext.dxf.tables?.layer?.layers?.[e.layer],s={type:"Feature",geometry:{type:"Polygon",coordinates:[n]},properties:{...e}};this.dxfContext.polygonFeatures.push(s);const i=r?.color??x(this.dxfContext.colorIndex++,"polygon").color,a=this.dxfContext.intToRGB(Number(i??0)),c=`${e.layer}-${e.type}-${e.handle}`;this.dxfContext.renderer_Object_Polygon[c]={value:e.layer||"default",symbol:{type:"simple-fill",style:"solid",color:[...a.slice(0,3),.5],outline:{color:this.dxfContext.intToRGB(Number(i??0)),width:1.5}}}}async processCircle(e){const t=e.center.x,n=e.center.y,r=Math.min(64,Math.max(16,Math.ceil(e.radius/5))),s=2*Math.PI/r,i=[];for(let a=0;a<=r;a++){const r=a*s,l=t+e.radius*Math.cos(r),c=n+e.radius*Math.sin(r);i.push(new o({x:l,y:c,spatialReference:this.dxfContext.sourceSR}))}const a=(await this.dxfContext.projectMany(i)).map((e=>[e[0],e[1]])),l=a[0],c=a[a.length-1];l&&c&&(l[0]!==c[0]||l[1]!==c[1])&&a.push(l);const d={type:"Feature",geometry:{type:"Polygon",coordinates:[a]},properties:{...e}};this.dxfContext.polygonFeatures.push(d);const y=this.dxfContext.dxf.tables?.layer?.layers?.[e.layer||"default"],p=e.color??y?.color??x(this.dxfContext.colorIndex++,"polygon").color;let f;f=Array.isArray(p)?p:"object"==typeof p&&"toRgba"in p?p.toRgba():this.dxfContext.intToRGB(p);const h=`${e.layer}-${e.type}-${e.handle}`;this.dxfContext.renderer_Object_Polygon[h]={value:e.layer||"default",symbol:{type:"simple-fill",style:"solid",color:f,outline:{color:f}}}}polygonToGeoJSON(){const t={type:"FeatureCollection",features:this.dxfContext.polygonFeatures},o=new Blob([JSON.stringify(t)],{type:"application/json"}),r=URL.createObjectURL(o);this.dxfContext.subLayers.push(new n({url:r,id:`dxf-polygons-${this.dxfContext.sanitizedFileName}-${(new Date).getTime()}`,title:`${this.dxfContext.fileName} - Polygons`,visible:!0,labelsVisible:!0,renderer:{type:"unique-value",field:"layer",defaultSymbol:(()=>{let e;const t=x(this.dxfContext.colorIndex++,"polygon");return t?.toJSON&&(e=t.toJSON()),{type:"simple-fill",style:d(e?.style),color:e?.color??x(this.dxfContext.colorIndex++,"polygon").color,outline:y(e?.outline)}})(),uniqueValueInfos:Object.values(this.dxfContext.renderer_Object_Polygon).map((t=>{const o=new i({color:t.symbol.outline?.color?new e(t.symbol.outline.color):new e(t.symbol.color??x(this.dxfContext.colorIndex++,"polygon").color),width:t.symbol.outline?.width??1.5}),n=t.symbol.color?[...t.symbol.color.slice(0,3),.3]:x(this.dxfContext.colorIndex++,"polygon").color,r=new s({style:"solid",color:new e(n),outline:o});return{value:t.value,symbol:r}}))}}))}}export class DxfToGeoJsonTextMapper{dxfContext;constructor(e){this.dxfContext=e}async processText(e){if(e.block)return;const[t,o]=await this.dxfContext.convertToSpatialReference(e.startPoint.x,e.startPoint.y);this.dxfContext.textFeatures.push({type:"Feature",geometry:{type:"Point",coordinates:[t,o]},properties:{...e}})}async processMText(e){const[t,o]=await this.dxfContext.convertToSpatialReference(e.position.x,e.position.y);this.dxfContext.textFeatures.push({type:"Feature",geometry:{type:"Point",coordinates:[t,o]},properties:{...e}})}async processAttDef(e){const[t,o]=await this.dxfContext.convertToSpatialReference(e.startPoint.x,e.startPoint.y),n=e.endPoint??e.startPoint,[r,s]=await this.dxfContext.convertToSpatialReference(n.x,n.y);this.dxfContext.textFeatures.push({type:"Feature",geometry:{type:"Point",coordinates:[t,o]},properties:{...e,startPoint:{x:t,y:o},endPoint:{x:r,y:s}}})}AnnotationToGeoJSON(){const e={1:"above-left",2:"above-center",3:"above-right",4:"center-left",5:"center-center",6:"center-right",7:"below-left",8:"below-center",9:"below-right"},t=new Map([[0,"left"],[2,"right"],[4,"center"]]),o=new Map([[0,"baseline"],[1,"bottom"],[2,"middle"],[3,"top"]]),n=this.dxfContext.textFeatures.map((n=>this._createTextGraphic(n,e,t,o))).filter((e=>null!==e)),s=new r({title:`${this.dxfContext.fileName??"dxf"} - Annotations`,id:`dxf-annotations-${this.dxfContext.sanitizedFileName??"dxf"}-${(new Date).getTime()}`,visible:!0,graphics:n});this.dxfContext.subLayers.push(s);const i=this.getMaximumFontSize(n);s.minScale=f(s.fullExtent??void 0,n.length,i),s.maxScale=0}getMaximumFontSize(e){let t=12;return e.forEach((e=>{if(!e)return;const o=e.attributes?.fontSize;"number"==typeof o&&Number.isFinite(o)&&(t=Math.max(t,o))})),t+2}_createTextGraphic(e,n,r,s){if("Point"!==e.geometry.type)return;const i=e.properties??{},l=this._getTextString(i);if(!l)return;const c=e.geometry.coordinates,x=new o({x:c[0],y:c[1],spatialReference:{wkid:4326}}),d=this._getTextColor(i),y=this._getFontSize(i),p=this._getRotation(i),{xoffset:f,yoffset:h}=this._getOffsets(i),{labelPlacement:u,horizontal:m,vertical:g}=this._getAlignment(i,n,r,s);return new t({geometry:x,symbol:new a({text:l,color:d,angle:p,xoffset:f,yoffset:h,horizontalAlignment:m,verticalAlignment:g,font:{family:"Arial",size:y}}),attributes:{...i,text:l,rotation:p,fontSize:y,horizontal:m,vertical:g,xoffset:f,yoffset:h,labelPlacement:u},popupTemplate:{title:"{text}",content:[{type:"fields",fieldInfos:Object.keys(i).map((e=>({fieldName:e,label:e})))}]}})}_getTextString(e){if(!e)return"";const t=String(e.text??"").trim(),o=String(e.prompt??"").trim(),n=t||o;return n||""}_getTextColor(e){const t=String(e?.layer||"0"),o=e?.color??this.dxfContext.dxf.tables?.layer?.layers?.[t]?.color??x(this.dxfContext.colorIndex++,"point").color;return this.dxfContext.intToRGB(o)}_getFontSize(e){let t=4*(e?.height??e?.textHeight??3);return t=Math.max(12,Math.min(t,30)),t}_getRotation(e){const t=String(e?.type??"").toUpperCase(),o=Number(e?.rotation??0);if("TEXT"===t)return-o;if("MTEXT"===t)return-o;if("ATTDEF"===t||"ATTRIB"===t){if(0!==o)return-o;if(e?.startPoint&&e?.endPoint){const{x:t,y:o}=e.startPoint,{x:n,y:r}=e.endPoint;if(t!==n||o!==r)return-180*Math.atan2(r-o,n-t)/Math.PI}return-o}if(e?.startPoint&&e?.endPoint){const{x:t,y:o}=e.startPoint,{x:n,y:r}=e.endPoint;return-180*Math.atan2(r-o,n-t)/Math.PI}return-o}_getOffsets(e){return{xoffset:Number(e?.xScale??0),yoffset:Number(e?.yScale??0)}}_getAlignment(e,t,o,n){return{labelPlacement:t[Number(e?.attachmentPoint??1)]??"above-left",horizontal:o.get(Number(e?.halign??e?.horizontalJustification))??"left",vertical:n.get(Number(e?.valign??e?.verticalJustification))??"baseline"}}}export class DxfToGeoJsonInsertBlockMapper{dxfContext;constructor(e){this.dxfContext=e}async processInsertFunction(e){if(!e.name||!this.dxfContext.dxf.blocks?.[e.name])return;const t=this.dxfContext.dxf.blocks[e.name],o=e.rotation||0,n={x:e.xScale??1,y:e.yScale??1,z:e.zScale??1},r=e.position||{x:0,y:0},[s,i]=await this.dxfContext.convertToSpatialReference(r.x,r.y);this._createInsertPointFeature(e,t,o,s,i);const a=(e.layer||"default").toString();this.dxfContext.renderer_Object_Point[a]=this._createLayerSymbol(a,e),await this._processBlockEntities(t,e,o,n,r)}async processPoint(t){const[o,n]=await this.dxfContext.convertToSpatialReference(t.position.x,t.position.y),r=this.dxfContext.dxf.header?.$PDMODE||0;let s="circle";if(32&~r)if(64&~r)switch(7&r){case 0:case 1:s="circle";break;case 2:s="cross";break;case 3:s="x"}else s="square";else s="circle";const i=(t.layer||"default").toString(),a=this.dxfContext.dxf.tables?.layer?.layers?.[i],l=t.color??a?.color??x(this.dxfContext.colorIndex++,"point").color,c=l instanceof e?l.toRgba():Array.isArray(l)?l:this.dxfContext.intToRGB(Number(l??0));this.dxfContext.pointFeatures.push({type:"Feature",geometry:{type:"Point",coordinates:[o,n]},properties:{...t}}),this.dxfContext.renderer_Object_Point[i]={value:i,symbol:{type:"simple-marker",style:s,size:this.dxfContext.dxf.header?.$PDSIZE||5,color:c}}}async processInsert(e){const t={...e};t.xScale=e.xScale??1,t.yScale=e.yScale??1,t.zScale=e.zScale??1,t.rotation=e.rotation??0,await this.processInsertFunction(t)}pointToGeoJSON(){const e={type:"FeatureCollection",features:this.dxfContext.pointFeatures},t=new Blob([JSON.stringify(e)],{type:"application/json"}),o=URL.createObjectURL(t),r=new n({url:o,id:`dxf-points-${this.dxfContext.sanitizedFileName}-${(new Date).getTime()}`,title:`${this.dxfContext.fileName} - Points`,labelsVisible:!0,renderer:{type:"unique-value",field:"layer",defaultSymbol:{type:"simple-marker",style:"circle",color:x(this.dxfContext.colorIndex++,"point").color,size:6},uniqueValueInfos:Object.values(this.dxfContext.renderer_Object_Point).map((e=>({value:e.value,symbol:{type:"simple-marker",style:"circle",size:e.symbol?.size||6,color:e.symbol.color??x(this.dxfContext.colorIndex++,"point").color}})))}});this.dxfContext.subLayers.push(r)}_createInsertPointFeature(e,t,o,n,r){this.dxfContext.pointFeatures.push({type:"Feature",geometry:{type:"Point",coordinates:[n,r]},properties:{layer:e.layer||"default",type:"INSERT",blockName:e.name,rotation:o,blockType:t?.name??e.name,color:e.color??this.dxfContext.dxf.tables?.layer?.layers?.[e.layer]?.color??x(this.dxfContext.colorIndex++,"polyline").color,text:t?.name??e.name}})}_createLayerSymbol(e,t){return{value:e,symbol:{type:"simple-marker",style:"circle",size:5,color:this.dxfContext.intToRGB(this.dxfContext.dxf.tables?.layer?.layers?.[t.layer]?.color??0)}}}_normalizeBlockEntities(e){const t=e.entities;return Array.isArray(t)?t:void 0===t?[]:"function"==typeof t[Symbol.iterator]?Array.from(t):Array.isArray(t.entities)?t.entities:"object"==typeof t&&void 0!==t?Object.values(t):[]}async _processBlockEntities(e,t,o,n,r){const s=this._normalizeBlockEntities(e);if(0!==s.length)for(const e of s){if(!e||"object"!=typeof e)continue;const s=e.type;if("BLOCK"===s||"ENDBLK"===s)continue;const i=JSON.parse(JSON.stringify(e));if(i.layer=e.layer&&"0"!==e.layer?e.layer:String(t.layer),0===e.color)i.color=t.color;else if(256===e.color||void 0===e.color){const e=this.dxfContext.dxf.tables?.layer?.layers?.[String(t.layer)];i.color=e?.color}try{this._transformEntityGeometry(i,n,o,r),this._adjustEntityAttributes(i,n,o,t.name),await this.dxfContext.dxfEntities([i])}catch{continue}}}_transformEntityGeometry(e,t,o,n){const r=o*Math.PI/180,s=(e,o)=>({x:e*t.x*Math.cos(r)-o*t.y*Math.sin(r)+n.x,y:e*t.x*Math.sin(r)+o*t.y*Math.cos(r)+n.y});e.vertices&&(e.vertices=e.vertices.map((e=>{const t=s(e.x,e.y);return{x:t.x,y:t.y,bulge:e.bulge}}))),e.center&&(e.center=s(e.center.x,e.center.y)),e.position&&(e.position=s(e.position.x,e.position.y))}_adjustEntityAttributes(e,t,o,n){e.radius&&(e.radius*=Math.max(t.x,t.y)),e.height&&(e.height*=t.y),void 0!==e.rotation&&(e.rotation=(e.rotation+o)%360),e.blockName=String(n)}}export function mapDXFLineTypeToEsri(e,t){if(!e)return"solid";const o=e.toUpperCase(),n=function(e,t){if(!e)return;const o=e.toUpperCase().trim(),n={BYLAYER:"solid",BYBLOCK:"solid",CONTINUOUS:"solid",HIDDEN:"dash",DASHED:"dash",DASHEDX2:"dash",DASHED2:"dash",CENTER:"dash-dot",CENTERX2:"dash-dot",CENTER2:"dash-dot",DASHDOT:"dash-dot",DOTTED:"dot",DIVIDE:"short-dash",DIVIDEX2:"short-dash-dot",DIVIDE2:"short-dash-dot"};if(n[o])return n[o];if(t?.length){const e=Math.abs(t[0]??0),o=Math.abs(t[1]??0);if(2===t.length)return e<8&&o<6?"short-dash":e>=8&&e<=15&&o>=6&&o<=15?"dash":"long-dash";if(4===t.length)return e<6&&o<6?"short-dash-dot":e>=6&&e<=15&&o>=6&&o<=15?"dash-dot":"long-dash-dot"}return}(o,t?.pattern?.map((e=>parseFloat(e))));if(n)return n;const r=function(e){const t=e.toUpperCase();return t.includes("LONG")?"long-dash":t.includes("DOUBLE")?"long-dash-dot":t.includes("PHANTOM")?"dash-dot":void 0}(o);if(r)return r;const s=function(e){if(e?.pattern&&Array.isArray(e.pattern)){const t=e.pattern,o=t.some((e=>parseFloat(e)>.2)),n=t.some((e=>0===parseFloat(e)));return o&&!n?"dash":!o&&n?"dot":o&&n?"dash-dot":"solid"}return}(t);return s||"solid"}export class DxfEntityProcessor{dxfContext;entityHandlers;constructor(e,t,o={}){const n={dxf:{header:{},tables:{viewPort:{handle:"",ownerHandle:"",viewPorts:[]},lineType:{handle:"",ownerHandle:"",lineTypes:{}},layer:{handle:"",ownerHandle:"",layers:{}}},entities:[],blocks:{}},renderer_Object_Point:{},renderer_Object_Line:{},renderer_Object_Polygon:{},sourceSR:e,targetSR:t,subLayers:[],pointFeatures:[],lineFeatures:[],polygonFeatures:[],textFeatures:[],async dxfEntities(){},convertToSpatialReference:async()=>[0,0],projectMany:async()=>[],intToRGB:p,colorIndex:0,...o};n.dxfToGeoJsonLineMapper=new DxfToGeoJsonLineMapper(n),n.dxfToGeoJsonPolygonMapper=new DxfToGeoJsonPolygonMapper(n),n.dxfToGeoJsonTextMapper=new DxfToGeoJsonTextMapper(n),n.dxfToGeoJsonInsertBlockMapper=new DxfToGeoJsonInsertBlockMapper(n),this.dxfContext=n,this.dxfContext.convertToSpatialReference=(e,t)=>this.convertToSpatialReference(e,t),this.dxfContext.projectMany=e=>this.projectMany(e),this.dxfContext.dxfEntities=async e=>this.process(e),this.entityHandlers={POINT:e=>this.dxfContext.dxfToGeoJsonInsertBlockMapper.processPoint(e),INSERT:e=>this.dxfContext.dxfToGeoJsonInsertBlockMapper.processInsert(e),LINE:async e=>{e.vertices?.length>=2&&await this.dxfContext.dxfToGeoJsonLineMapper.processLine(e)},ARC:async e=>{e.center&&void 0!==e.radius&&await this.dxfContext.dxfToGeoJsonLineMapper.processArc(e)},LWPOLYLINE:async e=>{Array.isArray(e.vertices)&&await this.dxfContext.dxfToGeoJsonLineMapper.processLWPolyline(e)},POLYLINE:async e=>{Array.isArray(e.vertices)&&await this.dxfContext.dxfToGeoJsonLineMapper.processPolyline(e)},SOLID:async e=>{e.points.length>=3&&await this.dxfContext.dxfToGeoJsonPolygonMapper.processSolid(e)},CIRCLE:async e=>{e.center&&e.radius&&await this.dxfContext.dxfToGeoJsonPolygonMapper.processCircle(e)},TEXT:e=>this.dxfContext.dxfToGeoJsonTextMapper.processText(e),MTEXT:async e=>{e.position&&await this.dxfContext.dxfToGeoJsonTextMapper.processMText(e)},ATTDEF:async e=>{e.startPoint&&await this.dxfContext.dxfToGeoJsonTextMapper.processAttDef(e)}}}getContext(){return this.dxfContext}async convertToSpatialReference(e,t){const n=new o({x:e,y:t,spatialReference:this.dxfContext.sourceSR}),[r]=await l([n],this.dxfContext.targetSR);return r?[r.longitude??0,r.latitude??0]:[0,0]}async projectMany(e){return(await l(e,this.dxfContext.targetSR)).map(((t,o)=>{const n=e[o];return[t?.longitude??n.x,t?.latitude??n.y]}))}async process(e){const t=Array.isArray(e)?e:[e];for(const e of t){if(!e||"BLOCK"===e.type||"ENDBLK"===e.type)continue;const t=this.entityHandlers[e.type];t&&await t(e)}}async processAll(){if(this.dxfContext.dxf.entities?.length>0){const e=50;for(let t=0;t<this.dxfContext.dxf.entities.length;t+=e){const o=this.dxfContext.dxf.entities.slice(t,t+e);await c(),await this.process(o)}}return await Promise.all([this.dxfContext.polygonFeatures.length>0&&this.dxfContext.dxfToGeoJsonPolygonMapper.polygonToGeoJSON(),this.dxfContext.lineFeatures.length>0&&this.dxfContext.dxfToGeoJsonLineMapper.lineToGeoJSON(),this.dxfContext.pointFeatures.length>0&&this.dxfContext.dxfToGeoJsonInsertBlockMapper.pointToGeoJSON(),this.dxfContext.textFeatures.length>0&&this.dxfContext.dxfToGeoJsonTextMapper.AnnotationToGeoJSON()].filter(Boolean)),this.dxfContext.subLayers}}
|
|
@@ -80,3 +80,9 @@ export declare function normalizeLineOutline(outline?: {
|
|
|
80
80
|
* @returns The calculated minimum scale.
|
|
81
81
|
*/
|
|
82
82
|
export declare function deriveAnnotationMinScale(extent: __esri.Extent | undefined, textCount: number, maxFontSize: number): number;
|
|
83
|
+
/**
|
|
84
|
+
* Sanitizes the symbol width.
|
|
85
|
+
*
|
|
86
|
+
* @param width The width to sanitize.
|
|
87
|
+
*/
|
|
88
|
+
export declare function sanitizeSymbolWidth(width: number | undefined): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export function mapDXFLineTypeToEsri(t,e){if(!t)return"solid";const
|
|
1
|
+
export function mapDXFLineTypeToEsri(t,e){if(!t)return"solid";const n=t.toUpperCase(),o=mapBasicLineType(n,e?.pattern?.map((t=>parseFloat(t))));if(o)return o;const r=mapIsoPatterns(n);if(r)return r;const a=mapLineTypePattern(e);return a||"solid"}export function mapBasicLineType(t,e){if(!t)return;const n=t.toUpperCase().trim(),o={BYLAYER:"solid",BYBLOCK:"solid",CONTINUOUS:"solid",HIDDEN:"dash",DASHED:"dash",DASHEDX2:"dash",DASHED2:"dash",CENTER:"dash-dot",CENTERX2:"dash-dot",CENTER2:"dash-dot",DASHDOT:"dash-dot",DOTTED:"dot",DIVIDE:"short-dash",DIVIDEX2:"short-dash-dot",DIVIDE2:"short-dash-dot"};if(o[n])return o[n];if(e?.length){const t=Math.abs(e[0]??0),n=Math.abs(e[1]??0);if(2===e.length)return t<8&&n<6?"short-dash":t>=8&&t<=15&&n>=6&&n<=15?"dash":"long-dash";if(4===e.length)return t<6&&n<6?"short-dash-dot":t>=6&&t<=15&&n>=6&&n<=15?"dash-dot":"long-dash-dot"}}export function mapIsoPatterns(t){const e=t.toUpperCase();return e.includes("LONG")?"long-dash":e.includes("DOUBLE")?"long-dash-dot":e.includes("PHANTOM")?"dash-dot":void 0}export function mapLineTypePattern(t){if(t?.pattern&&Array.isArray(t.pattern)){const e=t.pattern,n=e.some((t=>parseFloat(t)>.2)),o=e.some((t=>0===parseFloat(t)));return n&&!o?"dash":!n&&o?"dot":n&&o?"dash-dot":"solid"}}export function intToRGB(t){if(t>=1&&t<=255)return{1:[255,0,0,1],2:[255,255,0,1],3:[0,255,0,1],4:[0,0,255,1],5:[255,0,255,1],6:[0,255,255,1],7:[255,255,255,1]}[t]||[0,0,0,1];const e=t>>16&255,n=t>>8&255,o=255&t;return 255===e&&255===n&&255===o?[0,0,0,1]:[e,n,o,1]}export const VALID_FILL_STYLES=["backward-diagonal","cross","diagonal-cross","forward-diagonal","horizontal","none","solid","vertical"];export function normalizeFillStyle(t){if("string"!=typeof t)return"solid";const e=t.toLowerCase();if(VALID_FILL_STYLES.includes(e))return e;if(e.startsWith("esrisfs")){const t=e.replace(/^esrisfs/,"").replace(/([a-z])([A-Z])/g,"$1-$2").replace(/_/g,"-").replace(/^[^a-z0-9]+/g,"").toLowerCase(),n="undefined"===t?"none":t;if(VALID_FILL_STYLES.includes(n))return n}return"solid"}export function normalizeLineOutline(t){return{type:"simple-line",color:t?.color??[0,0,0],width:t?.width??1.5}}export function deriveAnnotationMinScale(t,e,n){if(!t||0===e)return 0;const o=Math.max(t.width,t.height),r=Math.max(1,Math.sqrt(e/100));let a=2*o*Math.max(.5,Math.min(n/12,3))/r;return a=Math.max(1e3,Math.min(a,2e7)),Math.round(a)}export function sanitizeSymbolWidth(t){if(void 0!==t&&t>0){const e=t>25?t/100:t;return Math.min(e,25)}return 1.5}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
window.navigationData = "data:application/octet-stream;base64,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"
|
|
1
|
+
window.navigationData = "data:application/octet-stream;base64,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"
|