不同ucs中的圆柱体
好的,我又把自己难住了。我试图定义一个新的ucs并在ucs中绘制一个圆柱体,而不是wcs。这是我到目前为止的代码Public Sub ucstest()
Dim ucsObj As AcadUCS
Dim origin As Variant
Dim xAxisPnt(0 To 2) As Double
Dim yAxisPnt(0 To 2) As Double
Dim ucsorigion(0 To 2) As Double
' Define the UCS
origin = Null
origin = ThisDrawing.Utility.GetPoint
xAxisPnt(0) = origin(0): xAxisPnt(1) = origin(1): xAxisPnt(2) = origin(2) - 1
yAxisPnt(0) = origin(0): yAxisPnt(1) = origin(1) + 1: yAxisPnt(2) = origin(2)
' Add the UCS to the UserCoordinatesSystems collection
Set ucsObj = ThisDrawing.UserCoordinateSystems.Add(origin, xAxisPnt, yAxisPnt, "New_UCS")
ThisDrawing.ActiveUCS = ucsObj
ThisDrawing.ModelSpace.AddCylinder origin, 1, 3
End Sub
我认为我需要以某种方式转换我的坐标,但我从来没有这样做过,所以有什么想法我应该做什么?
**** Hidden Message ***** 气缸使用这种
变体在WCS,我认为这是我的问题 当您插入圆时,它会插入世界坐标,但它会假设currnt ucs的法线。将circle.normal设置为0,0,1,然后使用ucs矩阵转换圆 如果你只是想画一个圆圈并挤出,继续...
...但是
有一个圆柱体命令,它要求第一个末端中心和半径,然后提示“圆柱体的高度或[另一端的中心]”,它允许您将另一端的中心放置在空间中的任何位置,而不管UCS如何。 可能值得调查。 它真的很脏,但我的大脑正在关闭。
这是有效的,但有一些怪癖:
1-你选择一条定义圆柱体位置的线
2-你选择线的中点b/c圆柱体被形心放置
3-你必须选择线的第三个点perp(正交/极性on是一件好事)
Public Sub ucstest()
Dim origin As Variant
Dim xAxisPnt As Variant
Dim yAxisPnt(0 To 2) As Double
Dim ucsorigion(0 To 2) As Double
Dim objcyl As Acad3DSolid
Dim dblLength As Double
Dim objLine As AcadLine
Dim varpick As Variant
Dim obje As AcadEntity
ThisDrawing.Utility.GetEntity obje, varpick
Set objLine = obje
dblLength = objLine.Length
origin = Null
origin = ThisDrawing.Utility.GetPoint
xAxisPnt = ThisDrawing.Utility.GetPoint(origin)
Set objcyl = ThisDrawing.ModelSpace.AddCylinder(origin, 1, dblLength)
Dim ang As Double
ang = 90
ang = ang * 3.141592 / 180#
objcyl.Rotate3D origin, xAxisPnt, ang
End Sub
周一需要更多的清理 这里有几个例子。
前2个使用法线,第三个使用ucs
Public Sub CylinderFromLine()
Dim oCyl As Acad3DSolid
Dim oCircle As AcadCircle
Dim oLine As AcadLine
Dim varpick As Variant
Dim Ent As AcadEntity
Dim N, oReg
Dim RegEnt(0) As AcadEntity
Dim V(2) As Double
Dim Unit As Double
Dim Vn(2) As Double
Dim P1, P2
ThisDrawing.Utility.GetEntity Ent, varpick
If Not TypeOf Ent Is AcadLine Then Exit Sub
Set oLine = Ent
' V = oLine.Delta 'Don't use the treacherous delta
P1 = oLine.StartPoint: P2 = oLine.EndPoint
V(0) = P2(0) - P1(0): V(1) = P2(1) - P1(1): V(2) = P2(2) - P1(2)
'Normalise the vector(It's length=1)
Unit = Sqr(V(0) * V(0) + V(1) * V(1) + V(2) * V(2))
Vn(0) = V(0) / Unit: Vn(1) = V(1) / Unit: Vn(2) = V(2) / Unit
Set oCircle = ThisDrawing.ModelSpace.AddCircle(oLine.StartPoint, 1)
oCircle.Normal = Vn
Set RegEnt(0) = oCircle
oReg = ThisDrawing.ModelSpace.AddRegion(RegEnt)
Set oCyl = ThisDrawing.ModelSpace.AddExtrudedSolid(oReg(0), oLine.Length, 0)
End Sub
Public Sub CylinderFromPoints()
'this mimics the Cylinder command
Dim oCyl As Acad3DSolid
Dim oCircle As AcadCircle
Dim Rad As Double
Dim P1, P2
Dim N, oReg
Dim dLength As Double
Dim RegEnt(0) As AcadEntity
Dim Util As AcadUtility
Set Util = ThisDrawing.Utility
P1 = Util.GetPoint(, "Specify center point for base of cylinder:")
Rad = Util.GetDistance(ToUcs(P1), "Specify radius for base of cylinder:")
P2 = ThisDrawing.Utility.GetPoint(ToUcs(P1), "Specify center of other end of cylinder:")
Dim V(2) As Double
V(0) = P2(0) - P1(0): V(1) = P2(1) - P1(1): V(2) = P2(2) - P1(2)
Dim Unit As Double
Dim Vn(2) As Double
'Normalise the vector(It's length=1)
Unit = Sqr(V(0) * V(0) + V(1) * V(1) + V(2) * V(2))
Vn(0) = V(0) / Unit: Vn(1) = V(1) / Unit: Vn(2) = V(2) / Unit
dLength = Sqr(V(0) ^ 2 + V(1) ^ 2 + V(2) ^ 2)
Set oCircle = ThisDrawing.ModelSpace.AddCircle(P1, Rad)
oCircle.Normal = Vn
Set RegEnt(0) = oCircle
oReg = ThisDrawing.ModelSpace.AddRegion(RegEnt)
Set oCyl = ThisDrawing.ModelSpace.AddExtrudedSolid(oReg(0), dLength, 0)
End Sub
Public Sub CylinderFromUcs()
Dim oUcs As AcadUCS
Dim Orig As Variant
Dim xAxisPnt(0 To 2) As Double
Dim yAxisPnt(0 To 2) As Double
Dim oCyl As Acad3DSolid
Orig = ThisDrawing.Utility.GetPoint
Set oCyl = ThisDrawing.ModelSpace.AddCylinder(Zero, 1, 3)
' Define the UCS
xAxisPnt(0) = 0: xAxisPnt(1) = 0: xAxisPnt(2) = -1
yAxisPnt(0) = 0: yAxisPnt(1) = 1: yAxisPnt(2) = 0
Set oUcs = ThisDrawing.UserCoordinateSystems.Add(Zero, xAxisPnt, yAxisPnt, "New_UCS")
oUcs.origin = Orig
oCyl.TransformBy oUcs.GetUCSMatrix
End Sub
Function ToUcs(pt As Variant) As Variant
ToUcs = ThisDrawing.Utility.TranslateCoordinates(pt, acWorld, acUCS, False)
End Function
Bryco,这些工作完美。
现在,你能解释发生了什么,这样我就知道发生了什么,这样我就可以在将来使用它吗?干得好。 谢谢CmdrDuh。我本来打算尝试一篇关于这些东西的文章,但这需要一点时间。
请注意圆柱体以外的对象的Ucs方法,由于某种原因,圆柱体的工作方式与其他实体略有不同。
“帮助”表示“创建一个 3D 实心圆柱体,其基础位于 WCS 的 XY 平面上。通常你在世界中插入一些东西,确保正态是0,0,1,然后将其转换为你想要的ucs(或矩阵)。
Bryco,我再次喜欢你的代码
感谢您的优雅
(Ya da ..)
胖
>'J'< 有几件事,在最后一个例子中,它使用“零”作为未定义。可能是来自其他地方的片段。
关于更好的事情:
我想我已经弄清楚了部分数学。P2-P1部分正在计算δX、delta Y和Z,对吗?我使用已知的XYZ坐标画了一些线,这就是看起来正在发生的事情。
现在我不完全确定发生了什么
在与这里的常驻数学大师在工作中交谈后,我的问题是oCircle.Normal不适用于V或Vn吗?我试过了,它确实有效。所以,我的最后一个问题是为什么你必须标准化向量?
页:
[1]
2