乐筑天下

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

Civil 3D表面处理帮助!

[复制链接]

1

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
11
发表于 2007-11-15 13:47:54 | 显示全部楼层 |阅读模式
我正在寻找一些帮助,帮助我们在Civil 3D 2008中实现曲面创建过程的自动化。不幸的是,我在编码方面相当笨,所以这并不像我想象的那样是一个简单直接的过程
我已经使用开发人员指南对示例代码进行了一些研究,但没有任何结果
我设想这段代码的作用是:
1)要求用户选择要素线#1(FL1)
2)要求用户选中要素线#2(FL2)
3)创建一个新的三角网曲面
,名称为Bldg 001(随着每个附加曲面的增加,数字会增加)图层“曲面BLDG”(在图形中作为默认三角网曲面图层存在)对于曲面样式“建筑曲面”(也是默认曲面样式)
4),曲面将通过首先添加FL1作为标准特征线来“构造”。第二,将添加FL2作为标准特征线,最后,将再次添加FL2,但这次是作为非破坏性边界
就这样-然后打开选择下两条要素线以创建下一个曲面(Bldg 002)。听起来不太复杂,但我一辈子都想不出来
这是我到目前为止汇编的代码-几乎都是从开发人员指南中盗取的
  1. (vl-load-com)
  2. (setq AcadObject (vlax-get-acad-object))
  3. (setq ActDoc (vla-get-activedocument AcadObject))
  4. ;;
  5. ;;
  6. ;; CODE TO CREATE SELECTION SET FL1 FOR EXTERIOR FEATURE LINE
  7. ;;
  8. ;;
  9. Sub Ch4_CreateSelectionSet()
  10.         Dim selectionset1 as AcadSelectionSet
  11.         Set selectionset1 = ThisDrawing.SelectionSets.Add("FL1")
  12.         selectionset1.SelectOnScreen
  13. End Sub
  14. ;;
  15. ;;
  16. ;; CODE TO CREATE SELECTION SET FL2 FOR INTERIOR FEATURE LINE
  17. ;;
  18. ;;
  19. Sub Ch4_CreateSelectionSet()
  20.         Dim selectionset2 as AcadSelectionSet
  21.         Set selectionset2 = ThisDrawing.Selectionsets.Add("FL2")
  22.         selectionset2.SelectOnScreen
  23. End Sub
  24. ;; CODE TO CREATE NEW SURFACE:
  25. ;;
  26. ;;
  27. Dim TinSurface As AeccTinSurface               
  28. Dim Tindata as New AeccTinCreationData
  29. TinData.Name = "Bldg Test"                                         ;SET NAME OF SURFACE TO "BLDG"
  30. ;; need to add counter system for surface #
  31. TinData.Description = "Building Surface from CPP Building datum" ;SET SURFACE DESCRIPTION
  32. TinData.Layer = "Surface Bldgs"                                        ;SET SURFACE LAYER
  33. TinData.BaseLayer = "Surface Bldgs"                                ;NOT SURE WHAT THIS DOES
  34. TinData.Style = "Building Surfaces"                                ;SET SURFACE STYLE
  35. Set Tinsurface = AeccDocument.Surfaces.AddTinSurface(TinData)        ;NOT SURE WHAT THIS DOES
  36. ;;
  37. ;;
  38. ;; CODE TO ADD THE EXTERIOR FEATURE LINE (FL1) AS A NON-DESTRUCTIVE BREAKLINE CODE TO THE SURFACE
  39. ;;
  40. ;;
  41. set 3DPoly = AeccDocument.Database.Modelspace.Add3DPoly(dPoints)
  42. 3dPoly.Closed = False
  43. Dim Breakline As AeCCSurfaceBreakline
  44. Dim vBLines as Variant
  45. Dim EntityArray(0) as AcadEntity
  46. Set EntityArray(0) = AeccDocument.Database.ModelSpace.Add3DPoly(dPoints)
  47. Set Breakline = TinSurface.Breaklines.AddNonDestructiveBreakline(EntityArray,"Exterior Non-Destructive Breakline", 1#)
  48. ;;
  49. ;;
  50. ;; ADD THE INTERIOR FEATURE LINE (FL2) AS A STANDARD BREAKLINE TO THE SURFACE(S1)
  51. ;;
  52. ;;
  53. set 3DPoly = AeccDocument.Database.Modelspace.Add3DPoly(dPoints)
  54. 3dPoly.Closed = False
  55. Dim Breakline As AeCCSurfaceBreakline
  56. Dim vBLines as Variant
  57. Dim EntityArray(0) as AcadEntity
  58. Set EntityArray(0) = AeccDocument.Database.Modelspace.Add3DPoly
  59. Set Breakline = TinSurface.Breaklines.AddStandardBreakline(EntityArray, "Exterior Boundary", 1#)
  60. Dim EntityArray(0) as AcadEntity
  61. Set EntityArray(0) = AeccDocument.Database.ModelSpace.Add3DPoly(dPoints)
  62. Set Breakline = TinSurface.Breaklines.AddStandardBreakline(EntityArray, "Interior Breakline", 1#)
  63. ;;
  64. ;;
  65. ;; ADD THE EXTERIOR FEATURE LINE (FL1) AS A NON-DESTRUCTIVE BOUNDARY TO THE SURFACE(S1)
  66. ;;
  67. ;;
  68. Dim Poly As AcadPolyline
  69. Set Poly = AeccDocument.Database.ModelSpace.AddPolyLine(dPoints)
  70. Poly.Closed = True
  71. Dim sName as String
  72. sName = "Surface Boundary"
  73. Dim NewBoundary as AeccSurfaceBoundary
  74. Set NewBoundary = Surface.Boundaries.Add(Poly, Sname, aeccBoundaryOuter, True, 0.5)

有人能帮忙吗

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2007-11-15 14:55:19 | 显示全部楼层
抱歉,我没有软件来玩。
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2007-11-15 15:38:05 | 显示全部楼层
在添加到曲面之前,是否可以发布具有柱基线的样例图形以及所需结果(使用不同的柱基线)。您的代码似乎在创建不必要的对象……但这可能是您想要的。
回复

使用道具 举报

1

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
11
发表于 2007-11-15 17:04:18 | 显示全部楼层
如果这段代码不符合你的预期,那么我需要你张贴那幅画。然而,我认为这是你想要的。注意,这里只是使用了一个通用的错误陷阱,我强烈建议做一些更健壮的事情.....
您将需要确保在VBA项目中设置Civil Land & LandUI参考。
  1. Sub test()
  2. Dim oApp As AeccApplication
  3. Dim oDoc As AeccDocument
  4. Dim oSurfs As AeccSurfaces
  5. Set oApp = Application.GetInterfaceObject("AeccXUiLand.AeccApplication.5.0")
  6. Set oDoc = oApp.ActiveDocument
  7. Set oSurfs = oDoc.Surfaces
  8. Dim Tindata As New AeccTinCreationData
  9. Tindata.Description = "Building Surface from CPP Building datum" 'SET SURFACE DESCRIPTION
  10. Tindata.Layer = "Surface Bldgs"                 'SET SURFACE LAYER
  11. Tindata.BaseLayer = "Surface Bldgs"             'NOT SURE WHAT THIS DOES
  12. Tindata.Style = "Building Surfaces"             'SET SURFACE STYLE
  13. Dim osurf As AeccSurface
  14. Dim iCount As Integer
  15. For Each osurf In oSurfs
  16.     If osurf.Name Like "Bldg ###" Then
  17.         Dim iTmp As Integer
  18.         iTmp = CInt(Right(osurf.Name, 3))
  19.         If iTmp > iCount Then iCount = iTmp
  20.     End If
  21. Next
  22. Dim sCurName As String
  23. Dim oEnt1 As AcadEntity
  24. Dim oEnt2 As AcadEntity
  25. Dim vPick As Variant
  26. Dim oPoly1 As Acad3DPolyline
  27. Dim opoly2 As Acad3DPolyline
  28. Dim oEnts(0) As AcadEntity
  29. Do Until Err.Number  0
  30.     iCount = iCount + 1
  31.     sCurName = "Bldg " & Format(iCount, "000")
  32.     On Error GoTo ResumeHere
  33.     ThisDrawing.Utility.GetEntity oEnt1, vPick, vbCr & "Select inside pline: "
  34.     Set oPoly1 = oEnt1
  35.     ThisDrawing.Utility.GetEntity oEnt2, vPick, vbCr & "Select outside pline: "
  36.     Set opoly2 = oEnt2
  37.     Tindata.Name = sCurName
  38.     Dim oTinSurf As AeccTinSurface
  39.     Set oTinSurf = oSurfs.AddTinSurface(Tindata)
  40.     Set oEnts(0) = oPoly1
  41.     oTinSurf.Breaklines.AddStandardBreakline oEnts, "Interior Breakline", 0.5
  42.     Set oEnts(0) = opoly2
  43.     oTinSurf.Breaklines.AddStandardBreakline oEnts, "Exterior Breakline", 0.5
  44.     oTinSurf.Boundaries.Add opoly2, "Exterior Boundary", aeccBoundaryOuter, True, 0.5
  45. ResumeHere:
  46. 'If Err Then MsgBox Err.Description ''uncomment to test for the error thrown
  47. Loop
  48. End Sub

回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2007-11-16 10:20:49 | 显示全部楼层
杰夫-非常感谢你的帮助。
对于您的代码,我目前在下面一行出错:
  1. Set oApp = Application.GetInterfaceObject("AeccXUiLand.AeccApplication.5.0")

我附上了一张图纸,希望它能更好地解释我想做的事情。我需要使用两条要素线作为特征线,然后使用外部要素线作为边界来构建曲面。我用的是Civil 3D 2008,如果这有什么不同的话。
回复

使用道具 举报

1

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
11
发表于 2007-11-16 11:38:45 | 显示全部楼层
一些要看的东西....
首先,抛出的错误是什么?我也在用2008-SP2,你有安装任何SP的吗?
其次,我看到您的绘图有特征线。API中有一个错误/缺陷(是的,Adesk已经记录了该错误/缺陷),不允许我们使用要素线添加特征线。一种解决方法是使用lisp (vlax-curve-*)函数提取每个PI的坐标并创建一个临时3dpoly。另一种方法是首先分解要素线,从而留下3dpoly(如果FL的PI具有不同的高程),或者LWPoly(如果PI都相同)(这也不能在代码中完成,因为在FL的API中没有暴露任何内容)。
我附上适合我的DVB,您的绘图的FL已分解。
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2007-11-16 14:42:54 | 显示全部楼层
杰夫,
现在我加载了你最新的DVB文件,一切都很好
我担心功能线可能会导致问题,但我可以解决这个问题。我喜欢使用功能行来实现其动态更新功能,但您的代码节省的时间比使用功能行的动态功能节省的时间要多得多。在使用要素线更新曲面的罕见情况下,我们现在可以简单地重新创建曲面定义
马克
回复

使用道具 举报

1

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
11
发表于 2007-11-16 16:11:19 | 显示全部楼层
不客气,马克!很高兴我能帮忙。
请记住在任何较新版本中测试是否可以使用功能线。由于Adesk知道这个问题,因此很有可能在下一个或两个版本中得到解决。要进行测试,只需注释掉2行,3行代码部分,然后更改引用和接口对象。(我们不知道这些在未来的版本中会是什么,但如果历史是任何指标,那么我敢打赌2009年的版本将使用Land 6.0。但这还有很长的路要走...
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2008-5-8 18:34:39 | 显示全部楼层

好了,2009年就到了,唉,作为我的代码管理员,我无法再运行这段代码了。我更改了行:
  1. Set oApp = Application.GetInterfaceObject("AeccXUiLand.AeccApplication.5.0")

现在改为:
  1. Set oApp = Application.GetInterfaceObject("AeccXUiLand.AeccApplication.6.0")

我得到一个运行时错误“13”-类型不匹配
回复

使用道具 举报

1

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
11
发表于 2008-5-8 19:06:39 | 显示全部楼层
欢迎回来,马克。
我只能推测您可能安装了2008和2009,并且没有在“工具/参考”下更改参考以反映2009版本。因此,当您将oApp设置为AeccApplication时,它会尝试使用2008库,但随后会尝试将其设置为2009版本。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-1 12:20 , Processed in 0.258964 second(s), 72 queries .

© 2020-2025 乐筑天下

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