如何将APS Viewer标记坐标转换为AutoCAD图纸坐标以生成多段线?
APS Viewer标记坐标转DWG图纸坐标实操流程
核心思路
你需要把Viewer中标记的三维坐标,转换成DWG图纸空间(布局)的二维坐标,才能在Design Automation里创建对应多段线。以下是具体步骤:
1. 确认Viewer当前视图类型
首先明确你是在模型空间还是**布局(图纸空间)**里绘制的标记:
- 调用
viewer.getCurrentViewable(),返回对象若is2d为true且name是布局名(比如"Layout1"),则处于布局视图; - 若
is2d为false(3D模型)或无布局名,则处于模型空间。
2. 获取视口ID(vpId)的正确方法
之前找不到vpId,是因为没在正确时机调用方法:
- 必须等模型完全加载,监听
viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, () => { ... })后再操作; - 布局视图下,调用
viewer.model.getDocumentNode().getViewports(),返回当前布局的所有视口列表,每个视口对象的id就是vpId; - 若在视口内绘制标记,还可以用
viewer.hitTest(screenX, screenY),返回结果里的viewportId就是当前点击对应的视口ID。
3. 坐标转换步骤
情况一:在布局视口内绘制标记(图纸空间操作)
拿到Viewer中的三维点viewerPoint(比如标记工具返回的THREE.Vector3)和vpId后:
- 获取视口的变换矩阵:
const vpTransform = viewer.model.getViewportTransform(vpId); - 转换为图纸空间坐标:
const paperPoint = viewerPoint.clone().applyMatrix4(vpTransform); // paperPoint的x、y即为图纸空间二维坐标,z值可忽略
该矩阵已包含视口的缩放、平移、旋转等变换,直接应用即可得到正确坐标。
情况二:在模型空间绘制标记,需转到图纸空间
如果标记在模型空间,先获取目标布局视口的参数:
- 从视口对象中拿到
scale(模型单位与图纸单位的比例)、position(视口在图纸空间的左上角坐标); - 转换公式(注意DWG坐标系Y轴向上,Viewer的Y轴可能需反转,视模型情况调整):
// modelPoint为Viewer中获取的模型空间点 const paperX = viewport.position.x + (modelPoint.x / viewport.scale); const paperY = viewport.position.y + (modelPoint.y / viewport.scale);
4. 传递坐标到Design Automation生成多段线
将转换后的二维点数组(比如[{x: ..., y: ...}, ...])传给Design Automation的AutoCAD插件:
- 在插件中使用AutoCAD .NET API的
Polyline.Create()方法,传入点集合,注意切换到对应布局空间(比如Database.CurrentSpaceId = layoutId)。
常见坑点
- 坐标反转:DWG的Y轴向上,Viewer的Y轴可能向下,转换后若坐标颠倒,将Y值取反即可;
- 视口匹配:若布局有多个视口,需确保标记点属于目标视口,用
hitTest返回的viewportId匹配最准确; - 单位问题:确认Viewer与DWG的单位一致,或在转换时加入单位换算系数。
内容的提问来源于stack exchange,提问作者Balaji A
相关产品推荐
相关产品推荐

