AutoCAD二次开发基础(二):曲线操作

AutoCAD二次开发系列


前言

样条曲线在船体型线设计中是使用较多的一类曲线,通过曲线求交等操作,可通过插值水线快速绘制横剖线和纵剖线。


一、AutoCAD中曲线分类

含义类型名称含义类型名称
直线AcadLine射线AcadXLine
AcadCircle圆弧AcadArc
多义线AcadPolyline样条曲线AcadSpline

二、曲线的通用操作

含义名称含义名称
求交IntersectWith镜像Mirror
移动Move三维镜像Mirror3D
偏移Offset旋转Rotate
缩放ScaleEntity三维旋转Rotate3D

1.编辑样条曲线型值点

提取并绘制样条曲线的型值点:

Sub getFitPoint()
Dim pt(2) as double
Dim s0 as AcadSpline
ThisDrawing.Utility.GetEntity so, p1, "选择曲线"
For i = 0 to so.NumberOfFitPoints - 1  ' NumberOfFitPoints: 样条曲线型值点个数
	pt(0) = so.fitPoints(i*3)
	pt(1) = so.fitPoints(i*3 + 1)
	pt(2) = so.fitPoints(i*3 + 2)
	Set point = ThisDrawing.ModelSpace.AddPoint(pt)
	point.Color = 2
Next i
End Sub

鼠标拾取点,将其插入选中的样条曲线:

Sub addPtToSpline()
Dim sp as acadSpline
Dim pt as Variant
On error goto toExit:
ThisDrawing.Utility.GetEntity sp, pp, "选择一条样条曲线"  ' pp为点击进行选择时光标所在点的位置,为该方法返回值之一
While(True)
	pt = ThisDrawing.Utility.GetPoint(pp, "选择要插入的点")  ' 选择样条曲线时返回的pp作为选择点时的参考点
	pp(0) = pt(0) : pp(1) = pt(1)  ' 将插入点作为下一次选择点时的参考点
	For i = 0 to sp.NumberofFitPoints - 1
		x_0 = sp.FitPoints(3 * i)
		x_1 = sp.FitPoints(3 * (i + 1))
		If (pt(0) - x_0) * (pt(0) - x_1) < 0 Then  ' 插入与其横向距离最近的两个点之间
			sp.AddFitPoint i+1, pt
			Exit For
		End If
	Next i
Wend
toExit:
End Sub

删除选中曲线的一个指定型值点:

Sub deletePtFromSpline()
Dim sp as AcadSpline
Dim pt as Variant
On Error GoTo toExit:
ThisDrawing.Utility.GetEntity sp, pp, "选择一条样条曲线"
pt = ThisDrawing.Utility.GetPoint(pp, "选择一个点")
mindis = 1000000
minIndex = 0
For i = 0 To sp.NumberOfFitPoints - 1
	x_0 = sp.FitPoints(3 * i)
	y_0 = sp.FitPoints(3 * i + 1)
	dis = Sqr((pt(0) - x_0)^2 + (pt(1) - y_0)^2)
	If dis < mindis Then  ' 找出与所选择点距离最近的型值点,然后删除
		mindis = dis
		minIndex = i
	End If
Next i
sp.DeleteFitPoint minIndex
toExit:
If Err.Number Then MsgBox Err.Description
End Sub

2.曲线求交点

曲线求交点主要运用到如下函数:

pta = curve.IntersectWith(curve1, type)
pta: 交点数组(double)
pta的点数: (UBound(pta) + 1) / 3
curve1: 待求交的曲线
Type:是否延长两曲线

type取值有:

名称含义
acExtendNone不延长任何一条曲线
acExtendThisEntity延长curve
acExtendOtherEntity延长curve1
acExtendBoth延长所有曲线

求取并绘制两条曲线的所有交点:

Sub curveIntersections()
Dim c1 as AcadEntity
Dim c2 as AcadEntity
Dim pt(2) as Double
On Error GoTo endSub
ThisDrawing.Utility.GetEntity c1, pt, "选择第一条曲线"
ThisDrawing.Utility.GetEntity c2, pt, "选择第二条曲线"
pta = c1.IntersectWith(c2, acExtendNone)
Count = (UBound(pta) + 1) / 3
For i = 0 to Count - 1
	pt(0) = pta(i * 3) : pt(1) = pta(i * 3 + 1)
	ThisDrawing.ModelSpace.AddPoint pt 
Next i
endSub:
End Sub

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值