如何使用设计自动化将 svg 导入 dwg

问题描述 投票:0回答:1

在 .NET Core 上使用 Autodesk Platform Services 实现了查看器。在存储桶中,我上传了 .dwg 格式的 2D 图纸。

我在查看器中启用了标记功能,因此现在我可以在 .dwg 之上进行任何标记

我目前所拥有的看起来像这样:

我需要使用我所做的标记保存此 DWG,并将其作为存储桶内的第二个 DWG,或者覆盖原始 DWG。

我已经检查了以下有关将 svg 导入 dwg 的链接,但到目前为止我找不到适合我的情况的东西。

Autodesk 设计自动化 API

如果有人知道处理此问题的另一种方法,请告诉我。

autodesk-forge autodesk-viewer autodesk-designautomation
1个回答
0
投票

没有直接的方法可以使用 Design Automation 将 SVF 标记导入 AutoCAD 模型空间。

你必须建立工作流程,我会尝试给你一个粗略的想法,[我计划将小型POC放在一起]但请注意将SVF标记导入AutoCAD是一项复杂的任务,主要是AutoCAD是无单位的,你需要考虑缩放,旋转,如果基础图没有任何单位,我们从

NOP_VIEWER.model.getPageToModelTransform()
得到的变换矩阵可能不准确。

AutoCAD 在 ACC 文档中具有此功能 [https://help.autodesk.com/view/ACD/2023/ENU/?guid=GUID-64CFD65E-ABD0-49A8-9218-D4E2D22BC070]

markupExt.generateData 返回的 SVG 跨越整个“纸张空间”,原点位于中心。 您需要提取标记元素,并构造等效的 AutoCAD 实体。

例如折线标记。

SVG 元数据可以

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" baseProfile="full" layer-order-id="markups-svg" style="position:absolute; left:0; top:0; transform:scale(1,-1); -ms-transform:scale(1,-1); -webkit-transform:scale(1,-1); -moz-transform:scale(1,-1); -o-transform:scale(1,-1); transformOrigin:0, 0; -ms-transformOrigin:0, 0; -webkit-transformOrigin:0, 0; -moz-transformOrigin:0, 0; -o-transformOrigin:0, 0; " width="2512" height="1278" viewBox="-2.8503522409754964 -0.0033170086124281184 16.707355499267578 8.500000000008502" pointer-events="painted" cursor="crosshair">
  <metadata>
    <markup_document xmlns="http://www.w3.org/1999/xhtml" data-model-version="4"/>
  </metadata>
  <g cursor="inherit" pointer-events="stroke">
    <metadata>
      <markup_element xmlns="http://www.w3.org/1999/xhtml" stroke-width="0.006651017214405641" stroke-color="#ff0000" stroke-opacity="1" fill-color="#ff0000" fill-opacity="0" type="polyline" position="5.100938961004755 5.52700380516462" size="6.537950022205427 3.824334898282383" rotation="0" locations="-2.5107590370117476 1.912167449141192 3.2689750111027136 0.6484741784044061 3.1692097513539013 -1.912167449141191 -3.2689750111027136 -1.7591940532098942"/>
    </metadata>
    <path id="markup" d="M -2.5107590370117476 1.912167449141192 l 5.779734048114461 -1.2636932707367858 l -0.09976525974881234 -2.560641627545597 l -6.438184762456615 0.15297339593129688 z" stroke-width="0.006651017214405641" stroke="rgba(255,0,0,1)" fill="none" transform="translate( 5.100938961004755 , 5.52700380516462 ) rotate( 0 )"/>
  </g>
</svg>

您可以看到标记位置和折线位置。

检查哪个视口、标记,使用该视口 ID。

const xform = viewer.model.getPageToModelTransform(VIEWPORT_ID);
viewer.model.getData().paperHeight, viewer.model.getData().paperWidth
Now transform point from Viewer coordinate system to AutoCAD WCS.
const point = new THREE.Vector2(/* read from the markups */);

transformCoordinates = (coordinate, pageToModelTransform) => {
    const data = viewer.model.getData();
    const PAPER_WIDTH = data.paperWidth;
    const PAPER_HEIGHT =data.paperHeight;

    coordinate.x = coordinate.x + 0.5 * PAPER_WIDTH;
    coordinate.y = coordinate.y + 0.5 * PAPER_HEIGHT;

    return new THREE.Vector3(coordinate.x, coordinate.y, 0).applyMatrix4(pageToModelTransform);
};

将标记作为 JSON 从查看器导出到您的服务器。

类似这样的事情。

 [HttpPost("markups")]
 public IActionResult Markups(Markup[][] markup)
 {
     _markups = markup;
     JsonSerializer serializer = new JsonSerializer
     {
         Formatting = Formatting.Indented
     };
     serializer.Converters.Add(new JavaScriptDateTimeConverter());
     
     serializer.NullValueHandling = NullValueHandling.Ignore;
     using (StreamWriter sw = new StreamWriter(@"..\markups.json"))
     {
         
         using (JsonWriter writer = new JsonTextWriter(sw))
         {
             var mainArray = new JArray();
             foreach (Markup[] sub in markup)
             {
                 var subArray = new JArray();
                 foreach (Markup m in sub)
                 {
                     var jobject = JObject.FromObject(m);                           
                     subArray.Add(jobject);                            
                 }
                 mainArray.Add(subArray);
             }
             serializer.Serialize(writer, mainArray);
         }
     }
     
     return Ok();
 }

现在在 AutoCAD 中。

创建一条直线。

for (int i = 0; i < m_markup.Locations.Length; i++)
    

    acPoly.AddVertexAt(i, new Point2d(m_markup.Locations[i].XCoord,  m_markup.Locations[i].YCoord), 0, m_markup.Size, m_markup.Size);
}
© www.soinside.com 2019 - 2024. All rights reserved.