Bryco 发表于 2006-11-17 14:52:08

不同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 *****

CADaver 发表于 2006-11-17 14:53:20

气缸使用这种
变体在WCS,我认为这是我的问题

Bryco 发表于 2006-11-17 14:55:46

当您插入圆时,它会插入世界坐标,但它会假设currnt ucs的法线。将circle.normal设置为0,0,1,然后使用ucs矩阵转换圆

Bryco 发表于 2006-11-17 15:51:47

如果你只是想画一个圆圈并挤出,继续...
...但是
有一个圆柱体命令,它要求第一个末端中心和半径,然后提示“圆柱体的高度或[另一端的中心]”,它允许您将另一端的中心放置在空间中的任何位置,而不管UCS如何。 可能值得调查。

Fatty 发表于 2006-11-17 16:23:21

它真的很脏,但我的大脑正在关闭。
这是有效的,但有一些怪癖:
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
周一需要更多的清理

Bryco 发表于 2006-11-17 16:34:56

这里有几个例子。
前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
   

Fatty 发表于 2006-11-18 17:50:27

Bryco,这些工作完美。
现在,你能解释发生了什么,这样我就知道发生了什么,这样我就可以在将来使用它吗?干得好。

Bryco 发表于 2006-11-20 12:32:54

谢谢CmdrDuh。我本来打算尝试一篇关于这些东西的文章,但这需要一点时间。
请注意圆柱体以外的对象的Ucs方法,由于某种原因,圆柱体的工作方式与其他实体略有不同。
“帮助”表示“创建一个 3D 实心圆柱体,其基础位于 WCS 的 XY 平面上。通常你在世界中插入一些东西,确保正态是0,0,1,然后将其转换为你想要的ucs(或矩阵)。

Fatty 发表于 2006-11-20 12:59:26

Bryco,我再次喜欢你的代码
感谢您的优雅
(Ya da ..)

>'J'<

CADaver 发表于 2006-11-20 15:36:13

有几件事,在最后一个例子中,它使用“零”作为未定义。可能是来自其他地方的片段。
关于更好的事情:
我想我已经弄清楚了部分数学。P2-P1部分正在计算δX、delta Y和Z,对吗?我使用已知的XYZ坐标画了一些线,这就是看起来正在发生的事情。
现在我不完全确定发生了什么

在与这里的常驻数学大师在工作中交谈后,我的问题是oCircle.Normal不适用于V或Vn吗?我试过了,它确实有效。所以,我的最后一个问题是为什么你必须标准化向量?
页: [1] 2
查看完整版本: 不同ucs中的圆柱体