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

不同ucs中的圆柱体

好吧,我又难倒自己了 我试图定义一个新的ucs,并在该ucs而不是wcs中绘制一个圆柱体 这是我到目前为止的代码[代码我想我需要以某种方式改变我的坐标,但我从来没有这样做过,所以我该怎么做?

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

圆柱体使用这个变体是在WCS中,我认为这是我的问题

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

或者对于那些想要大局的人,我真正需要做的是

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

插入圆时,它将插入到世界坐标中,但它将采用当前ucs的法线。设置圆。法线为0,0,1,然后使用ucsmatrix变换圆

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

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

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

它真的很脏,但我的大脑正在关闭
这是可行的,但也有一些怪癖:
1-你选择一条定义圆柱体走向的线
2-你选择线的中点b/c圆柱体由质心放置
3-你必须选择线的第三个点(正交/极性开是件好事)
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-18 17:50:27

这里是#039;这是几个例子
前两个使用法线,第三个使用ucsPublic 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 发表于 2006-11-20 12:32:54

布莱科,这些很好用&nbsp
;现在,你能解释一下发生了什么吗?这样我就知道发生了什么,这样我就可以在将来使用它了 干得好。

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

谢谢你。我本打算写一篇关于这方面的文章,但它'这需要一点时间
对于圆柱体以外的对象,请注意Ucs方法,由于某些原因,圆柱体的工作原理与其他实体略有不同
“帮助说”;创建一个三维实体圆柱体,其底部位于WCS的XY平面上&引用;通常,在世界中插入一些东西,确保法线为0,0,1,然后将其转换为所需的ucs(或矩阵)

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

Bryco,我再次喜欢你的代码,谢谢你的优雅(雅达)'J#039&书信电报;
页: [1] 2
查看完整版本: 不同ucs中的圆柱体