大家好。
我试图在AutoCAD Mecanical 2018文件中查找管段尺寸(直径)和长度。在所有情况下,管段都是实心3D类型,具有空心中心。我很快地画了一些代码来做这件事,它似乎工作,但我不是很聪明,所以它将只工作,如果管道沿Z轴定向。很简单。我可以用一堆“如果/那么”让它在其他正交视图中工作,但这并不适用于所有情况。
我的问题是,我需要它在任何方向上与管段一起工作。
这些管道将与许多其他非管道实体混合在一起,因此必须将对象识别为管道,然后必须确定其直径。
请注意,我不能依赖于管道末端是方形的,所以我不认为我可以通过brep.faces迭代查找某个直径的圆形面或做类似的事情。
我附加了一个dwg文件,其中包含两个管道段。一个简单的沿Z轴定向的例子,一个最坏的例子,我在所有三个轴上稍微旋转了管段,然后我切掉了末端。
下面是我测试的初始代码(它适用于Z对齐的管道段):
-
- Dim sf = New SelectionFilter(New TypedValue() {New TypedValue(CInt(DxfCode.Start), "3DSOLID")})
- Dim selResult As PromptSelectionResult = acEd.SelectAll(sf)
-
- Dim PipeODs As New Dictionary(Of String, Double) ' (OD, Nom)
- PipeODs.Add(CDbl(0.84).ToString, 0.5)
- PipeODs.Add(CDbl(1).ToString, 0.75)
- PipeODs.Add(CDbl(1.3125).ToString, 1)
- PipeODs.Add(CDbl(1.875).ToString, 1.5)
- PipeODs.Add(CDbl(2.375).ToString, 2)
- PipeODs.Add(CDbl(3.5).ToString, 3)
- PipeODs.Add(CDbl(4.5).ToString, 4)
- PipeODs.Add(CDbl(6.625).ToString, 6)
- PipeODs.Add(CDbl(8.625).ToString, 8)
- PipeODs.Add(CDbl(10.75).ToString, 10)
- Using acDoc.LockDocument()
- Using acTr As Transaction = acDoc.TransactionManager.StartTransaction
- Dim acBlkTbl As BlockTable = acTr.GetObject(acDB.BlockTableId, OpenMode.ForRead)
- Dim acBlkTblRec As BlockTableRecord = acTr.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
- For Each Obj As SelectedObject In selResult.Value ' loop thru each 3dsolid
- Dim eee As Entity = acTr.GetObject(Obj.ObjectId, OpenMode.ForRead)
- Dim objWork As Solid3d = acTr.GetObject(Obj.ObjectId, OpenMode.ForWrite) '.Clone
- If objWork.MassProperties.Volume = 0 Then
- Continue For
- End If
- Dim brep As New BoundaryRepresentation.Brep(objWork)
- Dim EXT As BoundBlock3d = brep.BoundBlock
- If EXT.Direction1.Length = EXT.Direction2.Length Then
- If PipeODs.ContainsKey(EXT.Direction1.Length.ToString) Then
- Dim pipeod As Double = EXT.Direction1.Length
- Dim pipelength As Double = EXT.Direction3.Length
- 'pa.Pipes.Add(New Pipe(pipeod, pipelength, Obj.ObjectId))
- objWork.Color = Autodesk.AutoCAD.Colors.Color.FromColor(System.Drawing.Color.White)
- End If
- End If
- Next
- End Using
- End Using
" Dim EXT As boundblock 3d = brep。BoundBlock”和下面的If/Then是(我假设)魔术需要发生的地方。我只是不理解旋转矩阵和坐标系矩阵,所以这超出了我的理解范围。
我希望这是足够的信息。如果有人能帮我,我将不胜感激。
谢谢!!
yy2hgvdcfb0.JPG
本帖以下内容被隐藏保护;需要你回复后,才能看到! 游客,如果您要查看本帖隐藏内容请 回复 |