找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 729|回复: 1

[每日一码] 等分曲线并标注

[复制链接]

已领礼包: 1个

财富等级: 恭喜发财

发表于 2017-5-26 15:00:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
  1. <CommandMethod("testcut")> _
  2.      Public Sub cut()
  3.         Dim db As Database = HostApplicationServices.WorkingDatabase
  4.         Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  5.         Dim ts As String = vbCr & "请选择线条(圆弧、直线或者多义线):"
  6.         Dim opt As New PromptEntityOptions(ts)
  7.         opt.SetRejectMessage(vbCr & "只能线条")
  8.         opt.AddAllowedClass(GetType(Polyline), True)
  9.         opt.AddAllowedClass(GetType(Arc), True)
  10.         opt.AddAllowedClass(GetType(Line), True)
  11.         Dim res As PromptEntityResult = ed.GetEntity(opt)
  12.         If res.Status <> PromptStatus.OK Then
  13.             ed.WriteMessage("用户自行退出!" & vbCr)
  14.         Else
  15.             '获取等分数
  16.             Dim iop As New PromptIntegerOptions("指定等分段的数量:")
  17.             iop.DefaultValue = 10
  18.             Dim irt As PromptIntegerResult = ed.GetInteger(iop)
  19.             Dim n As Integer
  20.             If irt.Status <> PromptStatus.OK OrElse irt.Value < 2 Then
  21.                 Return
  22.             Else
  23.                 n = irt.Value
  24.             End If
  25.             Dim entid As ObjectId = res.ObjectId
  26.             Using trans As Transaction = db.TransactionManager.StartTransaction()
  27.                 '得到拾取的对象
  28.                 Dim ent As Entity = trans.GetObject(entid, OpenMode.ForRead)
  29.                 Dim cv As Curve = DirectCast(trans.GetObject(ent.ObjectId, OpenMode.ForWrite), Curve)
  30.                 Dim len As Double = cv.GetDistanceAtParameter(cv.EndParam)
  31.                 Dim i As Integer
  32.                 For i = 0 To n
  33.                     Dim p As Point3d = cv.GetPointAtDist(i * len / n)
  34.                     Dim kp As Object = cv.GetFirstDerivative(cv.GetParameterAtDistance(i * len / n))
  35.                     Dim ka As Double = kp(1) / kp(0) - Math.PI / 2
  36.                     Call AddText(p, "等分点" & CStr(i), 3, ka, 1, 1)
  37.                 Next
  38.                 trans.Commit()
  39.             End Using
  40.         End If
  41.     End Sub
  42.     ' 由插入点、文字内容、文字高度和倾斜角度创建单行文字的函数.
  43.     Public Function AddText(ByVal position As Point3d, ByVal textString As String, ByVal height As Double, ByVal rotate As Double, ByVal dq As Integer, ByVal co As Integer) As ObjectId
  44.         'position为文字位置,textstring为文字内容,height为文字高度,rotate为文字角度,dq为对齐方式,co为颜色
  45.         Try
  46.             Dim ent As New DBText()
  47.             ent.Position = position
  48.             ent.TextString = textString
  49.             ent.Height = height
  50.             ent.Rotation = rotate
  51.             ent.ColorIndex = co
  52.             Select Case dq
  53.                 Case 0
  54.                     ent.HorizontalMode = TextHorizontalMode.TextMid
  55.                 Case 1
  56.                     ent.HorizontalMode = TextHorizontalMode.TextLeft
  57.                     ent.VerticalMode = TextVerticalMode.TextVerticalMid
  58.             End Select
  59.             ent.AlignmentPoint = position
  60.             Dim entId As ObjectId = AppendEntity(ent)
  61.             Return entId
  62.         Catch
  63.             ' 创建失败,则返回一个空的ObjectId.
  64.             Dim nullId As ObjectId = ObjectId.Null
  65.             Return nullId
  66.         End Try
  67.     End Function
  68.     ' 将图形对象加入到模型空间的函数.
  69.     Public Function AppendEntity(ByVal ent As Entity) As ObjectId
  70.         Dim db As Database = HostApplicationServices.WorkingDatabase
  71.         Dim entId As ObjectId
  72.         Using trans As Transaction = db.TransactionManager.StartTransaction
  73.             Dim bt As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForRead)
  74.             Dim btr As BlockTableRecord = trans.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
  75.             entId = btr.AppendEntity(ent)
  76.             trans.AddNewlyCreatedDBObject(ent, True)
  77.             trans.Commit()
  78.         End Using
  79.         Return entId
  80.     End Function



0812301124eb88a4b6c909cf5f.gif

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2017-7-15 11:10:55 | 显示全部楼层
老师:你这是定数等分,能不能写一个定距等分的程序,并在等分点上用“点对象”标注:谢谢了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 21:46 , Processed in 0.177487 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表