乐筑天下

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

ACAD2006VBA确定Acad3dSolid SolidType

[复制链接]

1

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
9
发表于 2010-12-22 09:12:19 | 显示全部楼层 |阅读模式
任何人都知道如何确定Acad3DSolid的Solid Type(Solid type)。
我的代码在绿线上失败。SolidType
  1. Public Function IsSphereTorus(oObject As AcadObject) as boolean
  2.     IsSphereTorus = false
  3.     Dim oSphere As Acad3DSolid
  4.     If TypeOf oObject Is Acad3DSolid Then
  5.         Set oSphere = oObject
  6.         [color=green]If oSphere.SolidType = "Sphere" Or oSphere.SolidType = "Torus" Then[/color]
  7.              IsSphereTorus = true
  8.         End If
  9.     End If
  10. End Function

每个帮助。SolidType仅输入...所以现在我该怎么办?

bief54cxtjr.jpg

bief54cxtjr.jpg

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

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

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2010-12-22 09:30:22 | 显示全部楼层
注意到什么不对劲吗?
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2010-12-22 10:40:31 | 显示全部楼层
你剩下的代码看起来像什么?
我很快就做好了这些。
  1. Option Explicit
  2. Public Const AppName = "VBA | 3D Solid"
  3. Public Sub Main()
  4.     Dim Entity As AcadEntity
  5.     Dim Point As Variant
  6.     Dim objObject As Acad3DSolid
  7.     On Error GoTo ErrMsg
  8.     ThisDrawing.Utility.GetEntity Entity, Point, "Select a 3D Solid: "
  9.     If TypeOf Entity Is Acad3DSolid Then
  10.         Set objObject = Entity
  11.         If IsSphereTorus(objObject) = True Then
  12.             MsgBox "Type of entity: " & objObject.SolidType, vbExclamation + vbOKOnly, AppName
  13.         Else
  14.             MsgBox "FAIL!", vbExclamation + vbOKOnly, AppName
  15.         End If
  16.     End If
  17.     Exit Sub
  18.    
  19. ErrMsg:
  20.     If Err.Number = "-2147352567" Then
  21.         MsgBox "You didn't pick anything.  Please try again.", vbExclamation + vbOKOnly, AppName
  22.     Else
  23.         MsgBox Err.Description & vbCrLf & Err.Number, vbCritical + vbOKOnly, AppName
  24.         Debug.Print Err.Number
  25.         Err.Clear
  26.     End If
  27. End Sub
  28. Public Function IsSphereTorus(oObject As AcadObject) As Boolean
  29.     IsSphereTorus = False
  30.     Dim oSphere As Acad3DSolid
  31.     If TypeOf oObject Is Acad3DSolid Then
  32.         Set oSphere = oObject
  33.         If oSphere.SolidType = "Sphere" Or oSphere.SolidType = "Torus" Then
  34.              IsSphereTorus = True
  35.         End If
  36.     End If
  37. End Function

只需复制/粘贴到一个模块中,然后运行MAIN sub。
回复

使用道具 举报

1

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
9
发表于 2010-12-22 11:15:07 | 显示全部楼层

我的测试代码只是测试每个is函数的最简单方法
  1. Public Sub Test_SphereTorus()
  2.     Set oAcadDoc = ThisDrawing
  3.     Dim oEllipse As AcadEllipse
  4.     Dim oEnt As AcadEntity
  5.     Dim oSphere As Acad3DSolid
  6.     Dim oPoint As Variant
  7.     Set oEnt = oAcadDoc.ModelSpace.AddSphere(MakePoint(0, 0, 0), 5)
  8.     Set oSphere = oEnt
  9.     MsgBox IsSphereTorus(oSphere)
  10. End Sub
  11. Public Function MakePoint(ByVal X As Double, ByVal Y As Double, ByVal Z As Double)
  12.    
  13.     Dim dCoordinate(0 To 2) As Double
  14.    
  15.     dCoordinate(0) = X
  16.     dCoordinate(1) = Y
  17.     dCoordinate(2) = Z
  18.    
  19.     MakePoint = dCoordinate
  20. End Function

长程代码将是一个条件循环或按需调用所有遇到或重新遇到的ModelSpace项。IsLine、IsCircle、IsEllipse、IsEllipseOpen等(所有二维对象都很容易识别),剩下的都是三维实体、IsSphere、IsCube、IsCylinder等。多段线和样条线最难识别,但在我们的图形中没有使用,因此不相关。
IS函数是我整个代码的各个部分的组成部分。起点/终点/中心点在不同类型的实体/对象之间有所不同,OSnap行为由传递的对象控制
例如,如果我想基于其他传递的几何体自动生成OSnap中心,我必须知道所述几何体是圆形还是球体,圆形是否为对象。中心,如果球体eRetval是object.centroid。因此,如果对象是Box或Cylinder类型,则返回其他对象
另一个例子是,如果在椭圆上寻找可用的捕捉点,我有IsEllipse和IsEllipseOpen…如果IsEllipse只有中心点和长度,则有可用的起点/终点和中心点。
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2010-12-22 11:37:24 | 显示全部楼层
您可以发布MakePoint的代码吗?
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2010-12-22 13:07:58 | 显示全部楼层
只是出于好奇,你想用它来完成什么?您的代码正在创建一个球体,然后您正在测试它是否是一个球体。您已经知道它是一个球体。
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2010-12-22 13:56:35 | 显示全部楼层
查看下面的图片。第一个是用代码创建的球体的属性。第二个是从“实体”工具栏创建的球体的属性
现在进入下一个问题……为什么要以这种方式创建它?
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2010-12-22 14:38:46 | 显示全部楼层
我在2008年做了我的,所以它也没有固定在那里。
回复

使用道具 举报

1

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
9
发表于 2010-12-22 15:03:46 | 显示全部楼层

是的,我注意到在VB监视窗口中比较菜单绘制和自动绘制的实体参数时有相同的结果。这也不是Sphere独有的...其他3d实体也有同样的行为。
简单的答案是:无论使用哪种绘制方法,ACAD2000中的测试都会产生相同的属性结果-都失败;因此,ACAD2006中的VBA尚未针对AddSphere等例程进行更新,以使用新版本手动绘制3d对象。
去怪胎的数字,感谢Autodesk!
现在我想起了为什么我使用Inventor进行3D建模和编程... :realmad:
要使测试用例工作,请替换
oacaddoc . model space . addshpere...废话连篇或者。getentity...关于oacaddoc的废话。SendCommand "sphere" & vbCr & "0,0,0" & vbCr & "5,0,0 " & vbCr
set object/entity/Osh pere = oacaddoc . model space . item(this drawing . model space . count-1)
对于我的完整代码,我现在必须永久保留遇到/绘制的每个3d实体的objectID,以便我可以在以后引用它们...可爱的...我想我会创建一个跟踪对象类,唉!%&($%^*&^)_*$ Autodesk
感谢Matt帮助我证明了另一个我希望不是真的不足之处
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-1 03:49 , Processed in 1.056522 second(s), 74 queries .

© 2020-2025 乐筑天下

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