乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 52|回复: 1

[编程交流] 热挤压3DFace对象i

[复制链接]

9

主题

15

帖子

6

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-6 11:24:06 | 显示全部楼层 |阅读模式
大家好
 
我们可以通过使用4个点来创建一个三维面,然后我想将三维面对象挤出到实体中,有人能帮我实现吗
 
情况1:如果4个点不共面
 
情况2:如果4个点共面
 
提前感谢
斯里坎特
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 13:14:12 | 显示全部楼层
需要一个区域实体来挤出三维实体;正如我们已经确定的,一个区域是一个“平面”实体。因此,您对非平面3dFaces可能性的担忧是有效的。
 
这是所请求例程的一部分(例程变得相当复杂),它将创建适当的区域。这可能会有所帮助。
 
  1. Sub RegionFrom3DFace()
  2. Dim varPkPt As Variant
  3. Dim ent As AcadEntity
  4.   With ThisDrawing
  5.   
  6.      .Utility.GetEntity ent, varPkPt, "Select a 3dFace: "
  7.      If Not TypeOf ent Is Acad3DFace Then Exit Sub
  8.      Dim entFace As Acad3DFace
  9.      
  10.      Dim varRegion As Variant
  11.      Dim varCoords As Variant
  12.      Dim bln3Sided As Boolean
  13.      Dim blnFlat As Boolean
  14.      Dim i As Integer, j As Integer
  15.      Dim pts(3) As Variant
  16.      Dim pt(2) As Double
  17.      Dim dblInitVect() As Double
  18.      Dim dblNextVect() As Double
  19.      Set entFace = ent
  20.      varCoords = entFace.Coordinates
  21.      For i = 0 To 3
  22.         For j = 0 To 2
  23.            pt(j) = varCoords(j + (i * 3))
  24.         Next
  25.      pts(i) = pt
  26.      Next
  27.      bln3Sided = CompPTs(pts(2), pts(3), 0.000001)
  28.      dblInitVect = VectorCross(VectorFrom2Pts(pts(0), pts(1)), _
  29.                    VectorFrom2Pts(pts(0), pts(2)))
  30.      dblNextVect = VectorCross(VectorFrom2Pts(pts(0), pts(2)), _
  31.                    VectorFrom2Pts(pts(0), pts(3)))
  32.      blnFlat = IsVectorZero(VectorCross(dblInitVect, dblNextVect))
  33.      
  34.      If bln3side Then
  35.         Dim ents(2) As AcadEntity
  36.         For i = 0 To 2
  37.            Set ents(i) = .ModelSpace.AddLine(pts(i), pts((i + 1) Mod 2))
  38.         Next
  39.         varRegion = .ModelSpace.AddRegion(ents)
  40.      Else
  41.         If blnFlat Then
  42.            Dim ents3(3) As AcadEntity
  43.            For i = 0 To 3
  44.               Set ents3(i) = .ModelSpace.AddLine(pts(i), pts((i + 1) Mod 4))
  45.            Next
  46.            varRegion = .ModelSpace.AddRegion(ents3)
  47.         Else
  48.            Dim ents1(2) As AcadEntity
  49.            Dim ents2(2) As AcadEntity
  50.            Dim varRegs2 As Variant
  51.            For i = 0 To 2
  52.               Set ents1(i) = .ModelSpace.AddLine(pts(i), pts((i + 1) Mod 3))
  53.            Next
  54.            For i = 0 To 1
  55.               Set ents2(i) = .ModelSpace.AddLine(pts(i + 2), pts((i + 3) Mod 4))
  56.               
  57.            Next
  58.            Set ents2(2) = ents1(2)
  59.            varRegion = .ModelSpace.AddRegion(ents1)
  60.            varRegs2 = .ModelSpace.AddRegion(ents2)
  61.         End If
  62.      End If
  63.   End With
  64. End Sub
  65. Function CompPTs(dblPt1 As Variant, dblPt2 As Variant, dblTol As Double) As Boolean
  66.   CompPTs = False
  67.   If Abs(dblPt1(0) - dblPt2(0)) < dblTol Then
  68.      If Abs(dblPt1(1) - dblPt2(1)) < dblTol Then
  69.         If Abs(dblPt1(2) - dblPt2(2)) < dblTol Then
  70.            CompPTs = True
  71.         End If
  72.      End If
  73.   End If
  74. End Function
  75. Function VectorFrom2Pts(dbl1stPt As Variant, dbl2ndPt As Variant) As Double()
  76. Dim dblDummy(0 To 2) As Double
  77.   dblDummy(0) = dbl2ndPt(0) - dbl1stPt(0)
  78.   dblDummy(1) = dbl2ndPt(1) - dbl1stPt(1)
  79.   dblDummy(2) = dbl2ndPt(2) - dbl1stPt(2)
  80.   VectorFrom2Pts = dblDummy
  81. End Function
  82. Public Function VectorCross(dblVect1() As Double, dblVect2() As Double) As Double()
  83. Dim dblDummy(0 To 2) As Double
  84. dblDummy(0) = dblVect1(1) * dblVect2(2) - dblVect1(2) * dblVect2(1)
  85. dblDummy(1) = dblVect1(2) * dblVect2(0) - dblVect1(0) * dblVect2(2)
  86. dblDummy(2) = dblVect1(0) * dblVect2(1) - dblVect1(1) * dblVect2(0)
  87. VectorCross = dblDummy
  88. End Function
  89. Function IsVectorZero(dblVector() As Double, Optional lngPrecision As Long = 6) As Boolean
  90.   IsVectorZero = False
  91.   If Round(dblVector(2), lngPrecision) <> 0# Then Exit Function
  92.   If Round(dblVector(1), lngPrecision) <> 0# Then Exit Function
  93.   If Round(dblVector(0), lngPrecision) <> 0# Then Exit Function
  94.   IsVectorZero = True
  95. End Function
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-6 02:15 , Processed in 0.664092 second(s), 56 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表