乐筑天下

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

从分解块挤出区域

[复制链接]

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2007-1-5 11:16:15 | 显示全部楼层 |阅读模式
好的,我'我把头发拔出来,我试图从一个区域创建一个挤出的实体,这是一个分解块。(我的想法是绘制区域,并将其作为块插入,然后分解块,留下可以挤出的区域。);我应该试试这个,还是用折线代替 我想我可以根据单个拾取点的坐标绘制一条多段线,但这似乎太多了。或者我可以将块从一个区域更改为一条多段线,并将其挤出吗 无论如何,当我试图捕捉爆炸的方块时,我崩溃了 有办法做到这一点吗?
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2007-1-5 11:22:33 | 显示全部楼层
我从其他代码开始,因此所有注释行
  1. Public Sub DrawWideFlangeSteel()
  2.       Dim oCyl As Acad3DSolid, oCircle As AcadCircle, oLine As AcadLine, oLayer As AcadLayer
  3.       Dim oBeam As Acad3DSolid, oReg As AcadRegion, oBlock As AcadBlockReference, oObject As AcadObject
  4.       Dim varpick As Variant
  5.       Dim Ent As AcadEntity
  6.       Dim Inspt As Variant
  7.       Dim RegEnt(0) As AcadEntity
  8.       Dim V(2) As Double, Unit As Double, Vn(2) As Double, dblBusDia As Double
  9.       Dim P1, P2
  10.       Dim newPT1 As Variant
  11.       Dim newPT2 As Variant
  12.       Set oLayer = ThisDrawing.Layers.Add("3D-BUSS-STEEL")
  13.       oLayer.color = 235
  14.       
  15.       Inspt = ThisDrawing.Utility.GetPoint(, "Pick Insertion Point: ")
  16.       If ThisDrawing.ActiveSpace = acModelSpace Then
  17.       Set oBlock = ThisDrawing.ModelSpace.InsertBlock(Inspt, "M:\MODEL-COMPONENTS\w8x24.dwg", 1#, 1#, 1#, 0)
  18.       Else
  19.       Set oBlock = ThisDrawing.PaperSpace.InsertBlock(Inspt, "M:\MODEL-COMPONENTS\w8x24.dwg", 1#, 1#, 1#, 0)
  20.       End If
  21.       ThisDrawing.Regen acActiveViewport
  22. Set oObject = oBlock.Explode
  23. '      ThisDrawing.Utility.GetEntity Ent, varpick
  24. '      If Not TypeOf Ent Is AcadLine Then
  25. '            MsgBox "That was not a Layout Line"
  26. '            Exit Sub
  27. '      End If
  28. '      Set oLine = Ent
  29. '      newPT1 = oLine.StartPoint
  30. '      newPT2 = oLine.EndPoint
  31. '      newPT1(2) = ConvertFeet(frmInsPart.cboBusHeight.Value)
  32. '      newPT2(2) = ConvertFeet(frmInsPart.cboBusHeight.Value)
  33. '      Set oLine = ThisDrawing.ModelSpace.AddLine(newPT1, newPT2)
  34. '      oLine.Layer = "3D-BUSS-CALC"
  35. '      P1 = oLine.StartPoint: P2 = oLine.EndPoint
  36. '      V(0) = P2(0) - P1(0): V(1) = P2(1) - P1(1): V(2) = P2(2) - P1(2)
  37.       'Normalise the vector(It's length=1)
  38. '      Unit = Sqr(V(0) * V(0) + V(1) * V(1) + V(2) * V(2))
  39. '      Vn(0) = V(0) / Unit: Vn(1) = V(1) / Unit: Vn(2) = V(2) / Unit
  40. '      dblBusDia = CDbl(frmInsPart.cboBusSize.Value + 0.5) / 2
  41. '      Set oCircle = ThisDrawing.ModelSpace.AddCircle(oLine.StartPoint, dblBusDia)
  42.       ThisDrawing.Regen acActiveViewport
  43. '      oCircle.Normal = Vn    ' Vn or V both work here.
  44. '      ThisDrawing.Regen acActiveViewport
  45. '      Set RegEnt(0) = oCircle
  46. '      oReg = ThisDrawing.ModelSpace.AddRegion(RegEnt)
  47. '      Set oCyl = ThisDrawing.ModelSpace.AddExtrudedSolid(oReg(0), oLine.Length, 0)
  48. '      oCircle.Delete
  49. '      oReg(0).Delete
  50. End Sub

回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2007-1-5 11:30:11 | 显示全部楼层
哇,好了,深呼吸,放松……好了,现在不'感觉好多了吗
好的,既然你回来了,要不要再试一次?画、插入、分解、挤出……你能解释一下为什么你'我想这样做?你的意图是什么
要获取分解对象的对象,请将newObjs作为变量进行Dim。爆炸;在这个块中只有一个对象将oEntity Dim oEntity作为AcadEntity设置oEntity=newObjs(0),当我编写这个时,你发布了基本上回答了我问题的代码……但请注意我是如何得到分解区域的。。。。。。。
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2007-1-5 11:59:52 | 显示全部楼层
是的,非常感谢。好的,长话短说,我正在创建一个三维变电站设计工具,这将有助于在三维中绘制一个变电站,并弹出一个BOM表等等 我用的是8“;我的大多数钢支架都使用钢管,但有时我们使用宽翼缘梁作为支架 一旦完成,我将把它张贴在这里,供任何有兴趣在现实世界中测试/使用的人使用。
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2007-1-5 12:46:18 | 显示全部楼层
这是我出错的地方吗 我需要一个变体来捕捉爆炸的东西 我试着将oSomething作为AcadObject。爆炸't工作
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2007-1-5 13:14:22 | 显示全部楼层
是的,那'就是这样。它将是块中对象的数组。
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2007-1-5 13:58:39 | 显示全部楼层
对不起,指挥官,我想你的主要问题在你身上;t要在非XY WCS平面中创建区域,首先创建区域,然后在所需的法线中旋转它,尽管我可能错了;J#039~
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2007-1-5 14:01:40 | 显示全部楼层
谢谢杰夫,我知道这是可以做到的,我就是做不到;找不到那条信息
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2007-8-29 11:01:57 | 显示全部楼层
好的,既然我已经开始了这个线程,我想我可以在这里继续 上面的代码都是固定的,工作得很好 我有一个新问题,我正在分别创建3个三维实体,并希望将它们结合在一起
  1. Public Sub AddDeadEnd(PhSpace As Double, PoleSp As Double, PoleHt As Double, BmHt As Double)
  2.       Const VK_ESCAPE = &H1B
  3.       Const VK_LBUTTON = &H1
  4.       Const VK_SPACE = &H20
  5.       Const VK_RETURN = &HD
  6.       Const VK_LEFT = &H25
  7.       On Err GoTo err_control
  8.       Dim inspt As Variant, dblRotation As Double, dblTOC As Double, leftLeg As Variant, rightLeg As Variant
  9.       Dim oCurrLayeR As AcadLayer, intAutoSnap As Integer, intOSMode As Integer, PI As Double, LL2 As Variant
  10.       Dim oPline As AcadLWPolyline, oEntity(0) As AcadEntity, regent(0) As AcadEntity, obj3d As Acad3DSolid
  11.       Dim objRegion
  12.       Set oCurrLayeR = ThisDrawing.ActiveLayer
  13.       'IsSetup
  14.       dblTOC = CDbl(InputBox("What is T.O.C. elevation? ie 12 or 0 or -12"))
  15.       ThisDrawing.SetVariable "ORTHOMODE", 1
  16.       intAutoSnap = ThisDrawing.GetVariable("AUTOSNAP")
  17.       ThisDrawing.SetVariable "AUTOSNAP", 0
  18.       intOSMode = ThisDrawing.GetVariable("OSMODE")
  19.       ThisDrawing.SetVariable "OSMODE", 32
  20.       inspt = ThisDrawing.Utility.GetPoint(, "Select Deadend Insertion Point: ")
  21.       ThisDrawing.SetVariable "OSMODE", 512
  22.       dblRotation = ThisDrawing.Utility.GetAngle(inspt, "Pick Line Direction: ")
  23.       PI = Atn(1) * 4
  24.       ThisDrawing.SetVariable "OSMODE", 0
  25.       inspt(2) = inspt(2) + dblTOC
  26.       leftLeg = ThisDrawing.Utility.PolarPoint(inspt, dblRotation - ((PI * 90) / 180), PoleSp / 2)
  27.       rightLeg = ThisDrawing.Utility.PolarPoint(inspt, dblRotation + ((PI * 90) / 180), PoleSp / 2)
  28.       Call LayerSet("3D-STEL", 235)
  29.       DrawDeadendPole leftLeg, PoleHt
  30.       DrawDeadendPole rightLeg, PoleHt
  31.       leftLeg(2) = leftLeg(2) + BmHt
  32.       Set oPline = ThisDrawing.ModelSpace.AddLightWeightPolyline(PolygonVexs(leftLeg, 8, 5))
  33.       oPline.Closed = True
  34.       oPline.Elevation = BmHt
  35.       oPline.Update
  36.       Set regent(0) = oPline
  37.       objRegion = ThisDrawing.ModelSpace.AddRegion(regent)
  38.       Set obj3d = ThisDrawing.ModelSpace.AddExtrudedSolid(objRegion(0), PoleSp, 0)
  39.       regent(0).Delete
  40.       objRegion(0).Delete
  41.       
  42.       LL2 = ThisDrawing.Utility.PolarPoint(leftLeg, dblRotation, 12)
  43.       obj3d.Rotate3D leftLeg, LL2, ((PI * -90) / 180)
  44. Exit_Here:
  45.       ThisDrawing.ActiveLayer = oCurrLayeR
  46.       ThisDrawing.SetVariable "AUTOSNAP", intAutoSnap
  47.       ThisDrawing.SetVariable "OSMODE", intOSMode
  48.       ThisDrawing.SetVariable "INSUNITS", 1
  49.       Exit Sub
  50. err_control:
  51.       Select Case Err.Number
  52.       Case -2147352567
  53.       'Debug.Print Err.Number, Err.Description
  54.             varcancel = ThisDrawing.GetVariable("LASTPROMPT")
  55.             If InStr(1, varcancel, "*Cancel*")  0 Then
  56.                   If GetAsyncKeyState(VK_ESCAPE) And 8000 > 0 Then
  57.                         Err.Clear
  58.                         Resume Exit_Here
  59.                   ElseIf GetAsyncKeyState(VK_LBUTTON) > 0 Then
  60.                         Err.Clear
  61.                         Resume
  62.                   End If
  63.             Else
  64.                   If GetAsyncKeyState(VK_SPACE) Then
  65.                         Resume Exit_Here
  66.                   End If
  67.       'Missed the pick, send them back!
  68.                   Err.Clear
  69.                   Resume
  70.             End If
  71.       Case Else
  72.             MsgBox Err.Description
  73.             Resume Exit_Here
  74.       End Select
  75. End Sub
DrawDeadendPole leftLeg和Right leg是前两个3d对象,您可以在代码底部看到第三个
代码是
  1. Private Sub DrawDeadendPole(insptpole As Variant, PoleHt As Double)
  2.       Dim dblBase As Double, dblTop As Double, dblHeight As Double
  3.       Dim obj3d As Acad3DSolid, regent(0) As AcadEntity
  4.       Dim oPline As AcadLWPolyline
  5.       Dim cenPt As Variant, iNum As Integer, intAutoSnap As Integer
  6.       Dim dblAng As Double, dblRad As Double, dblAngle As Double
  7.       Dim objRegion
  8.       dblHeight = PoleHt
  9.       dblTop = 18 / 2
  10.       dblAngle = Atn((dblTop - dblBase) / dblHeight)
  11.       iNum = 12
  12.       cenPt = insptpole
  13.       dblRad = 29 / 2
  14.       Set oPline = ThisDrawing.ModelSpace.AddLightWeightPolyline(PolygonVexs(cenPt, iNum, dblRad))
  15.       oPline.ConstantWidth = 0
  16.       oPline.Layer = "0"
  17.       oPline.Closed = True
  18.       oPline.Update
  19.       Set regent(0) = oPline
  20.       objRegion = ThisDrawing.ModelSpace.AddRegion(regent)
  21.       Set obj3d = ThisDrawing.ModelSpace.AddExtrudedSolid(objRegion(0), dblHeight, dblAngle)
  22.       regent(0).Delete
  23.       objRegion(0).Delete
  24.       ThisDrawing.Regen acActiveViewport
  25. End Sub
  26. Function PolygonVexs(cenPt As Variant, iNum As Integer, _
  27.                      dblRad As Double, Optional mode As Integer = 0) As Variant
  28.       Dim tmpPt As Variant
  29.       Dim iCnt As Integer
  30.       Dim vCnt As Integer
  31.       Dim vxCnt As Integer
  32.       Dim PI As Double
  33.       PI = Atn(1) * 4
  34.       Dim dltAng As Double
  35.       Dim dblAng As Double
  36.       Dim initAng As Double
  37.       dltAng = 2 * PI / iNum
  38.       initAng = dltAng / 2
  39.       vxCnt = 2 * iNum - 1
  40.       iCnt = 0
  41.       vCnt = 0
  42.       ReDim ptsarr(0 To vxCnt) As Double
  43.       If mode = 0 Then dblRad = dblRad / Cos(dltAng / 2)
  44.       While iCnt < iNum
  45.             dblAng = initAng + dltAng * iCnt
  46.             tmpPt = ThisDrawing.Utility.PolarPoint(cenPt, dblAng, dblRad)
  47.             iCnt = iCnt + 1
  48.             ptsarr(vCnt) = tmpPt(0): ptsarr(vCnt + 1) = tmpPt(1)
  49.             vCnt = vCnt + 2
  50.       Wend
  51.       PolygonVexs = ptsarr
  52. End Function
无论如何,问题是如何在创建三维实体以稍后使用布尔并集时捕捉它们
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2007-8-29 11:05:21 | 显示全部楼层
我尝试将DrawDeadendPole设置为函数,并使用Set 3dobj=drawDeadeEndPole,但没有&#039;t工作&nbsp;我可能做错了,或者没有#039;t从正确的实体开始&nbsp;本人&#039;我想这就是我要走的路,我只是#039;我还没弄明白。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-6 01:40 , Processed in 0.479172 second(s), 73 queries .

© 2020-2025 乐筑天下

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