创建了一个参考,虽然创建时可以指定旋转和平移,但只能是先平移,后旋转,无法满足我的需求。有没有类似Eelement.ApplyTransform的函数,可以让参考随意旋转平移?
先平移后旋转没有问题呀,我们一般构建Transform时也是这样做的。
因为在Element中,我们可以通过多次调用ApplyTransform来自己控制旋转和平移的顺序,但在参考中,你设置的旋转和平移,它只能执行一次,所以灵活性较差,我的需求,是需要先将参考中指定点对齐到主Model的原点,然后旋转,旋转完再平移,这个需求似乎没办法通过一次平移和一次旋转实现。
参考元素其内部应该是仅仅保存了最终的一个变换结果,您如果想要在原有基础上执行新的变换的话,可以善加利用矩阵的特性。
比如,先调用DgnAttachment.GetRotation获得当前的旋转矩阵,然后用该矩阵乘以您想要旋转的矩阵,最后调用DgnAttachment.SetRotMatrix将结果矩阵设置回去即可。
Answer Verified By: lingwei liu
DgnDocumentMoniker moniker = DgnDocumentMoniker.CreateFromFileName(dgnFile.GetFileName(), null); DgnAttachment attachment = sheetDgnModel.CreateDgnAttachment(moniker, DRAWING_NAME); if(attachment != null) { attachment.StoredScale = 1/SheetScale; DTransform3d transform = DTransform3d.FromTranslation(new DPoint3d(centerPoint.X, centerPoint.Y, 0.0) * uor); transform = transform * DTransform3d.Rotation(2, Angle.FromRadians(centerVector.Azimuth > Math.PI ? -Math.PI * 3 / 2 + centerVector.Azimuth : -Math.PI / 2 + centerVector.Azimuth)); transform = transform * DTransform3d.FromTranslation(new DPoint3d(-centerPoint.X, -centerPoint.Y, 0.0) * uor); DVector3d colX, colY, colZ; transform.GetColumns(out colX, out colY, out colZ); attachment.SetMasterOrigin(new DPoint3d(realWidth / 2 / SheetScale, SheetHeight / 2, 0.0) * uor); attachment.SetRefOrigin(new DPoint3d(centerPoint.X, centerPoint.Y, 0.0) * uor); DMatrix3d rotateMatrix = DMatrix3d.FromColumns(colX, colY, colZ); attachment.SetRotMatrix(rotateMatrix); attachment.WriteToModel(true); }
非常感谢,已实现,代码供大家参考!
非常感谢您的分享,贯彻了我们社区的“人人为我,我为人人”的精神。赞一个!