乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 37|回复: 2

建议:在选择集循环中高亮显示选定的3dVertex

[复制链接]

3

主题

9

帖子

1

银币

初来乍到

Rank: 1

铜币
21
发表于 2015-5-11 17:10:49 | 显示全部楼层 |阅读模式
我所做的就是在一条多边形线上高亮显示一个3d顶点,然后我想以某种方式改变它。就像使用属性托盘来滚动顶点一样。参见代码。AutoCAD 2014、Windows 7、VB.net
  1.     Public Sub UtilityLine()
  2.         Dim acDoc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
  3.         Dim acCurDb As Database = acDoc.Database
  4.         Dim ed As Editor = acDoc.Editor
  5.         Dim east, north, ele As Double
  6.         'Dim strText As String
  7.         '' Start a transaction
  8.         Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  9.             '' Request for objects to be selected in the drawing area
  10.             Dim acSSPrompt As PromptSelectionResult = acDoc.Editor.GetSelection()
  11.             '' If the prompt status is OK, objects were selected
  12.             If acSSPrompt.Status = PromptStatus.OK Then
  13.                 Dim acSSet As SelectionSet = acSSPrompt.Value
  14.                 '' Step through the objects in the selection set
  15.                 For Each acSSObj As SelectedObject In acSSet
  16.                     '' Check to make sure a valid SelectedObject object was returned
  17.                     If Not IsDBNull(acSSObj) Then
  18.                         '' Open the selected object for write
  19.                         Dim acEnt As Entity = acTrans.GetObject(acSSObj.ObjectId, _
  20.                                                                 OpenMode.ForWrite)
  21.                         acEnt.Highlight()
  22.                         ed.Regen()
  23.                         If Not IsDBNull(acEnt) Then
  24.                             Dim obj As DBObject = acTrans.GetObject(acEnt.ObjectId, OpenMode.ForWrite)
  25.                             ' lightweight polyline
  26.                             Dim lwp As Polyline = TryCast(obj, Polyline)
  27.                             If lwp IsNot Nothing Then
  28.                                 ' Loop to get each vertex
  29.                                 Dim vn As Integer = lwp.NumberOfVertices
  30.                                 For i As Integer = 0 To vn - 1
  31.                                     Dim pt As Point3d = lwp.GetPoint3dAt(i)
  32.                                     east = pt(0)
  33.                                     north = pt(1)
  34.                                     ed.WriteMessage(vbLf & pt.ToString())
  35.                                 Next
  36.                             Else
  37.                                 ' 2D polyline
  38.                                 Dim p2d As Polyline2d = TryCast(obj, Polyline2d)
  39.                                 If p2d IsNot Nothing Then
  40.                                     ' Use foreach to get each contained vertex
  41.                                     For Each vId As ObjectId In p2d
  42.                                         Dim v2d As Vertex2d = DirectCast(acTrans.GetObject(vId, OpenMode.ForWrite), Vertex2d)
  43.                                         ed.WriteMessage(vbLf & v2d.Position.ToString())
  44.                                     Next
  45.                                 Else
  46.                                     ' 3D polyline
  47.                                     Dim p3d As Polyline3d = TryCast(obj, Polyline3d)
  48.                                     If p3d IsNot Nothing Then
  49.                                         Dim p3dColour As String = p3d.Color.ToString
  50.                                         For Each vId As ObjectId In p3d
  51.                                             Dim zM As New ZoomObj
  52.                                             Dim v3d As PolylineVertex3d = DirectCast(acTrans.GetObject(vId, OpenMode.ForWrite), PolylineVertex3d)
  53.                                             east = v3d.Position(0)
  54.                                             north = v3d.Position(1)
  55.                                             ele = v3d.Position(2)
  56.                                             Dim zMax = New Point3d(east + 1, north + 1, 1)
  57.                                             Dim zMin = New Point3d(east - 1, north - 1, 1)
  58.                                             zM.Zoom(zMin, zMax, v3d.Position, 1)
  59.                                             p3d.Highlight()
  60.                                             Dim dText As New PromptEntityOptions(vbLf & "Select Depth: ")
  61.                                             dText.SetRejectMessage("not text")
  62.                                             dText.AddAllowedClass(GetType(DBText), False)
  63.                                             Dim resdText As PromptEntityResult = ed.GetEntity(dText)
  64.                                             If resdText.Status = PromptStatus.OK Then
  65.                                                 Dim depthText As DBText = DirectCast(acTrans.GetObject(resdText.ObjectId, _
  66.                                                           OpenMode.ForRead), DBText)
  67.                                                 Dim depthLen = depthText.TextString.Length
  68.                                                 Dim dthTxt As String = depthText.TextString
  69.                                                 dthTxt = Mid(dthTxt, 3, depthLen - 1)
  70.                                                 Dim depthOff As Double = CDbl(dthTxt)
  71.                                                 v3d.Position = New Point3d(east, north, ele - depthOff)
  72.                                                 ed.WriteMessage(vbLf & "Depth= " & dthTxt)
  73.                                             End If
  74.                                         Next
  75.                                     End If
  76.                                 End If
  77.                             End If
  78.                         End If
  79.                     End If
  80.                 Next
  81.                 '' Save the new object to the database
  82.                 acTrans.Commit()
  83.             End If
  84.             '' Dispose of the transaction
  85.         End Using
  86.     End Sub

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2015-5-11 18:35:19 | 显示全部楼层
可以使用TransientGraphics创建标记,就像使用特性选项板选择顶点时使用的标记一样。下面是一些执行此操作的示例代码(抱歉,在c#中)。aGi正在引用以下内容:
使用aGi=Autodesk.AutoCAD。图形界面
在每个顶点的代码中使用:
showX(pt,7)
并在转到下一个顶点之前删除它们:
removeMarkers()
私有静态DBObjectCollection m_mrkers=new dbobjectcolcollection()
私有静态整数集合intColl=new IntegerCollection()
私有void showX(Point3d pt,int-color)
{
//使用指定颜色的两行临时显示“X”的代码。使用简单的颜色索引1-255。
双倍大小=2//对于该示例,此代码是硬编码的。应使用基于屏幕大小的值。
双x=pt.x
双y=pt.y
Point3d pt1=新的Point3d(-0.5*size)+x、(-0.5*size)+y,0
Point3d:pt2=新的Point3d((0.5*size)+x,(0.5*size)+y,0)
行line1=新行(pt1,pt2)
line1.ColorIndex=颜色
行line2=新行(line1.StartPoint,line1.EndPoint)
line2.ColorIndex=颜色
//我们在与第1行相同的位置创建了第2行,让我们将其旋转90度以创建“X”
line2.TransformBy(矩阵3d.Rotation(Math.PI*0.5,Vector3d.ZAxis,pt))
aGi.TransientManager.CurrentTransientManager。AddTransient(第1行,aGi.TransientDrawingMode.DirectTopmost,128,intColl)
aGi.TransientManager.CurrentTransientManager。AddTransient(第2行,aGi.TransientDrawingMode.DirectTopmost,128,intColl)
m_ mrkers.Add(第1行)
m_ mrkers.Add(第2行)
}
私有void removeMarkers()
{
//完成后将它们全部移除……不要让屏幕杂乱无章
用于(int i=0;i
{
aGi.TransientManager.CurrentTransientManager。擦除瞬态(m_mrkers[i],intColl)
m_mrkers[i].Dispose()
}
m_mrkers.Clear()
}
回复

使用道具 举报

3

主题

9

帖子

1

银币

初来乍到

Rank: 1

铜币
21
发表于 2015-5-11 18:51:11 | 显示全部楼层
Ta Jeff_M看起来是一个很好的地方。 是一种享受。实际上,一开始从未注意到您的代码。因此,在查看代码之前研究瞬态图形的好处是不会懒惰于旧的Ctrl-C;Ctrl-V 组合。
再次感谢。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 02:46 , Processed in 0.159474 second(s), 58 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表