QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 6648|回复: 45
收起左侧

[已解决] VB控制AUTOCAD求隔热型材截面特性提取特性值问题

[复制链接]
发表于 2013-10-4 22:44:25 | 显示全部楼层 |阅读模式 来自: 中国山东潍坊

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
woaishuijia版主!在您的帮助下我的隔热型材惯性矩计算已经有很大进展!但还有一些未解决的问题!第一个面域及第二个面域提取特性正确,但求并集后截面特性提取错误!我把需解决的问题在附件中都有完整描述!衷心感谢您对我这位老“菜鸟"的支持!

隔热型材面域并集及截面特性计算源文件.rar

483.76 KB, 下载次数: 21

发表于 2013-10-5 10:40:00 | 显示全部楼层 来自: 中国吉林长春
简单看了下你的问题和程序,并集后的面域变量名是 RoomObjects(0),你在求截面特性时的参数仍然用的是 MyEnty,问题应该出在这里.
发表于 2013-10-5 20:22:09 | 显示全部楼层 来自: 中国山东潍坊
woaishuijia 发表于 2013-10-5 10:40 static/image/common/back.gif! O, c  ^- o" s7 e
简单看了下你的问题和程序,并集后的面域变量名是 RoomObjects(0),你在求截面特性时的参数仍然用的是 MyEnty ...
4 a1 k6 o8 G( }- m+ a
我下午改变方式拿源程序琢磨了一下!如果我求并集时先选择两个大截面中的一个(不先选择隔热条)出来的结果是正确的!出来的结果正确我再把根据正确参数计算的一些公式带入就能完全解决求隔热型材惯性矩的问题!我把全部的程序编辑完成后再发给您!我就奇怪求并集时为什么必须先输两大截面中一个,而不能先选隔热条!
发表于 2013-10-5 20:43:44 | 显示全部楼层 来自: 中国山东潍坊
您好!我刚才试验了一下!加上set MyEnty=RoomObjects(0)就没问题了!您觉得源代码还是不是能简化好多!这样重复的地方太多!
发表于 2013-10-5 22:25:30 | 显示全部楼层 来自: 中国吉林长春
suke0012 发表于 2013-10-5 20:43 static/image/common/back.gif0 ]! q' W8 L) s; ^
您好!我刚才试验了一下!加上set MyEnty=RoomObjects(0)就没问题了!您觉得源代码还是不是能简化好多!这样 ...
9 Z! c. Q7 p; C' _& _9 K
加上这一行是正确的,但不是最好的.可优化的地方很多,呵呵.2 g) Z. J  e8 B- y# a3 \
你程序的功能,基本就是打开文档,创建面域并查询,面域并集并查询,保存关闭文档等.用VBA最合适不过了,用VB简直是自寻烦恼.+ K) e' U; T" L* P
你的CAD2005是完全安装吗?如果在安装时把VBA功能添加上,就可以用VBA,比用VB间接控制CAD方便很多.
. ~# ~+ v! D& u不过,CAD2005的VBA不太好,就是运行时CPU太累了,换个高版本的CAD,比如2008,效果很不错的
 楼主| 发表于 2013-10-6 07:58:51 | 显示全部楼层 来自: 中国山东潍坊
woaishuijia 发表于 2013-10-5 22:25 static/image/common/back.gif
6 M; V. Z1 |  H. r* J& P" p$ n& Z加上这一行是正确的,但不是最好的.可优化的地方很多,呵呵.
- Y0 H; T5 m7 _! |. q% ~5 x9 M你程序的功能,基本就是打开文档,创建面域并查 ...

- q+ `6 D) Y) T8 Jwoaishuijia您好!我现在就是想用VB去控制!VBA只能在AUTOCAD运行后去控制!数据很难直接提取到VB中!我的力学计算等都必须在VB中进行!今天我把后面计算部分的源代码设计完后问题就完全解决了!前面做的只是提取每个截面的数据,但隔热型材惯性矩计算还是较复杂的,这些数据是根本!谢谢您出的主意不断开阔我的思路!
 楼主| 发表于 2013-10-7 14:58:32 | 显示全部楼层 来自: 中国山东潍坊
woaishuijia版主,您好!还有一个问题向您请教!发的源代码是计算竖向截面特性的源代码!如果我把截面旋转90度计算横向截面的怎样去编写代码简单呢!
发表于 2013-10-8 06:34:19 | 显示全部楼层 来自: 中国吉林长春
逆风的香 发表于 2013-10-7 14:58 static/image/common/back.gif
- ^) b* u* e1 {# o: S6 ewoaishuijia版主,您好!还有一个问题向您请教!发的源代码是计算竖向截面特性的源代码!如果我把截面旋转9 ...

5 w% t  |6 D/ N4 t0 X首先我认为没有必要.因为你已经把截面的X轴和Y轴惯性矩及上下左右四个方向的抵抗矩,面积矩都计算出来了,旋转90度只不过是计算结果互换一下而已.
% ?# O6 k* J+ e7 B如果一定要重新计算,当然是在CAD上把截面面域以其形心为基点旋转90度再计算最为简单.方法是在把面域以其形心为基点移动到坐标原点后,以坐标原点(即截面形心)为基点旋转
  1. '将质心移到原点7 U2 q) G) x0 b' z
  2. MoveFrom(0) = Xc.Centroid(0): MoveFrom(1) = Xc.Centroid(1): MoveFrom(2) = 0
    ! q. I* A* J2 N+ ]
  3. MoveTo(0) = 0: MoveTo(1) = 0: MoveTo(2) = 03 R0 d8 J" i2 Q0 V3 [/ S
  4. Xc.Move MoveFrom, MoveTo4 T$ T' h1 n" f
  5. Xc.Rotate MoveTo, SelDoc.Utility.AngleToReal(90, acDegrees)
    % }; V  W. C; ]  {' [
  6. '算出外框最左下角及右上角4 K0 A* i7 q8 J9 \) O  R- i: W
  7. Xc.GetBoundingBox MinPo, MaxPo
复制代码
Xc.Rotate MoveTo, SelDoc.Utility.AngleToReal(90, acDegrees) 这一行使用了CAD图元的 Rotate 方法,它有两个参数,第一个参数是基点,第二个参数是角度,单位是弧度.在这里又使用了CAD文档对象的 Utility 集合(可称为"实用工具集")中的 AngleToReal 方法,它的作用是把其它单位制的角度转换为弧度,它有两个参数,第一个是其它单位制的角度,第二个指出这个角度的单位(命名常量).
" }2 L7 Z, D: i* m5 Y其实使用 Utility.AngleToReal 只是为了程序的可读性,如果图代码简单,可以直接写成
  1. Xc.Rotate MoveTo, 1.5707963267949
复制代码
另外,对你代码中有一点不理解
  1. '取出各轴惯性矩
    ' }" m  ]0 Z3 X) x2 ?: k
  2. If Round(Abs(Xc.MomentOfInertia(1)), 0) = 1 Then: ^, g( j. Z" a
  3.     Ix = Xc.MomentOfInertia(1)
    & A  C- b( l7 q9 J# B: j
  4.     Iy = Xc.MomentOfInertia(0)6 X% O& A) }" L7 _8 K& m9 ^0 ?0 l- P
  5. Else6 u* r( m* r4 C
  6.     Ix = Xc.MomentOfInertia(0)% N; S$ |' m0 J9 {
  7.     Iy = Xc.MomentOfInertia(1)1 j: B6 a1 \2 q/ d: h
  8. End If
复制代码
为什么要在Y轴惯性矩在0.5到1.5之间时,把X轴和Y轴惯性矩互换过来使用,后面的力学计算不是就错了吗?
 楼主| 发表于 2013-10-8 16:11:38 | 显示全部楼层 来自: 中国山东潍坊
woaishuijia 发表于 2013-10-8 06:34 static/image/common/back.gif
) Q% h4 o: F* U' u+ L* R* V& v首先我认为没有必要.因为你已经把截面的X轴和Y轴惯性矩及上下左右四个方向的抵抗矩,面积矩都计算出来了,旋 ...

" j% T- I# U4 S  M6 `woaishuijia版主,您好!我好好琢磨一下吧!您给我的思路很有启发性!其实旋转90度的惯性矩与不旋转90度惯性矩是完全一样的!只是坐标轴方向有根本变化!我把源代码编好后给您审核!谢谢您!
 楼主| 发表于 2013-10-31 10:53:11 | 显示全部楼层 来自: 中国山东潍坊
woaishuijia,您好!计算隔热型材惯性矩的源代码我十月初根据您的建议已经编写好了!但现在有没有办法解决两个问题:一、原来选择截面时选择方式为:先选择一侧截面,再选择另外一侧截面,最后选择隔热条及一侧另一侧截面求并集。能不能调整为这种方式呢:直接选择一侧截面,另一侧截面,再选择隔热条求并集后输出截面特性。二、怎么解决CAD版本的问题,比方说我现在在引用中设置为autocad 2010 type library,就能实现打开2004,2006,2008,2010几个版本的CAD格式的文件!我把计算隔热型材的理论依据及我计算的源代码都发给您!麻烦您看看我提出的两个问题怎么解决好!能编写出这源代码多亏您的指教!谢谢您!
7 v5 A7 E  j: U9 M1 M7 o

隔热型材面域并集及截面特性计算源文件 横料计算(20131020).rar

3.96 MB, 下载次数: 13

 楼主| 发表于 2013-11-3 15:01:18 | 显示全部楼层 来自: 中国山东潍坊
woaishuijia,您好!还有一个问题向您请教!点击“生成autocad对象“按钮后,经常启动不了AUTOCAD,提示”切换到“”重试“,只有先启动AUTOCAD,再点击“生成autocad对象“才能正常运行!这个问题怎么解决!谢谢您!
发表于 2013-11-7 16:02:49 | 显示全部楼层 来自: 中国吉林四平
这段时间我工作太忙了,过几天抽时间看看你的程序。对不起啊
 楼主| 发表于 2013-11-7 18:08:46 | 显示全部楼层 来自: 中国山东潍坊
woaishuijia 发表于 2013-11-7 16:02 static/image/common/back.gif
; k' ?" ?, ?4 s" M3 q这段时间我工作太忙了,过几天抽时间看看你的程序。对不起啊
6 q$ S1 p3 z# Q
woaishuijia,您好!4 {6 d4 H- q+ _2 G) _
   我知道您这几天在展会上!呵呵!辛苦您了!没有您帮忙我写不出隔热型材的计算源代码来!
; }- j+ Z' n! p& c. N) x                                                         
 楼主| 发表于 2013-11-15 07:53:46 | 显示全部楼层 来自: 中国山东潍坊
逆风的香 发表于 2013-11-7 18:08 static/image/common/back.gif( M8 K4 A' W6 {; u) d4 x
woaishuijia,您好!
0 O2 R( U% o' q   我知道您这几天在展会上!呵呵!辛苦您了!没有您帮忙我写不出隔热型材的计算源 ...

3 M3 k6 M, g$ Ywoaishuijia版主!您好!我忘了说明一个问题!两根隔热条是面域为一体的,操作中先选择上截面,再选择下截面,最后一步是选择两根一体的隔热条及上截面及下截面,这样才最终取得结果!竖料方向为图示方向,横料是旋转90度后再执行上面的操作!辛苦您了!麻烦您看看哪些地方还能简化!谢谢您!
发表于 2013-11-24 06:30:43 | 显示全部楼层 来自: 中国吉林四平
逆风的香 发表于 2013-10-31 10:53 static/image/common/back.gif
. |4 ~' T! S5 L1 u1 }+ a3 Owoaishuijia,您好!计算隔热型材惯性矩的源代码我十月初根据您的建议已经编写好了!但现在有没有办法解决两 ...
原来选择截面时选择方式为:先选择一侧截面,再选择另外一侧截面,最后选择隔热条及一侧另一侧截面求并集。能不能调整为这种方式呢:直接选择一侧截面,另一侧截面,再选择隔热条求并集后输出截面特性。

8 V' r: ^, O  c9 E6 h1 D当然可以.先选择并分别把三个面域赋值给三个变量,最后再统一运算就行了啊.; ]5 v  O! ?' s% N
怎么解决CAD版本的问题,比方说我现在在引用中设置为autocad 2010 type library,就能实现打开2004,2006,2008,2010几个版本的CAD格式的文件!
后期绑定.编程完成后,把对CAD类库的引用取消,程序中涉及CAD类的对象型变量声明一律改为Object类型.
* p6 g  K/ R) P6 p; a
点击“生成autocad对象“按钮后,经常启动不了AUTOCAD,提示”切换到“”重试“,只有先启动AUTOCAD,再点击“生成autocad对象“才能正常运行!
这是因为启动CAD需要一定的时间,在过程没有结束之前你让VB做其它事,就会出现这种情况.解决的办法就是不要让VB在CAD启动写成之前接受其它指令.+ n+ h% I/ K: q0 ]# w
比如在过程的开始部分把窗体隐藏起来,在过程的结尾(CAD启动完成后程序才能运行到这里)再显示;或者把窗体的Enabled属性先改为False,然后再改为True;或者直接把启动CAD的代码放到Form_Load()过程中,只有启动并绑定了CAD才能显示程序窗体,等等.; Q+ s( R1 \8 r0 c. [5 R
3 z+ _( ~' W9 I4 Q8 E/ y
PS:你电脑中有CAD病毒,压缩包中的"acaddoc.lsp"就是,本版区有网友上传的专杀工具,自己搜索下载杀一下吧
 楼主| 发表于 2013-11-24 07:53:58 | 显示全部楼层 来自: 中国山东潍坊
woaishuijia 发表于 2013-11-24 06:30 static/image/common/back.gif
9 z# u$ Z* s2 T1 v8 @" V9 Y- a当然可以.先选择并分别把三个面域赋值给三个变量,最后再统一运算就行了啊.
; h0 y5 P0 Z; X后期绑定.编程完成后,把对C ...

* v9 K" |! ?; z1 V9 i. l, iwoaishuijia,您好!谢谢您指明方向!我把编程的方式整理好后再发给您!我觉得我这位新手在您的指导下已经有很大的进步了!由衷感激您的支持!谢谢您!
 楼主| 发表于 2013-11-24 08:17:21 | 显示全部楼层 来自: 中国山东潍坊
woaishuijia,您好!您能不能发一点版本后期绑定的源代码给我参考一下!后期绑定我没接触过,我也不知道看那些书能找到相关内容!谢谢您!
发表于 2013-11-24 10:45:44 | 显示全部楼层 来自: 中国吉林四平
逆风的香 发表于 2013-11-24 08:17 static/image/common/back.gif; V# r; y0 A  Y/ ~
woaishuijia,您好!您能不能发一点版本后期绑定的源代码给我参考一下!后期绑定我没接触过,我也不知道看那 ...
/ N- x  t' ^/ n1 j8 `
新建一个工程,在"引用"对话框中引用CAD2010类库并输入代码如下图6 w  I" F: S5 i; a
Untitled-1.gif
  1. Dim CAD As AcadApplication, DOC As AcadDocument, C As AcadCircle6 @5 S* q$ v1 W0 Y4 p  r$ t/ b
  2. Dim P(2) As Double- H4 ?" O3 {; I) k. {
  3. On Error Resume Next8 d+ s+ O8 W, q, r/ o0 @$ b
  4. Set CAD = GetObject(, "autocad.application.18")
    3 m# n, @- v4 M8 I+ {& L" p
  5. If Err Then8 o) S5 i4 }# Q3 Q  Q
  6. Err.Clear: e* k3 W8 F8 l; h) b8 {
  7. Set CAD = CreateObject("autocad.application.18")$ Z5 z. H6 `2 \3 a& f
  8. End If/ u7 Q1 z7 g# O8 Y! H7 P* ^' O
  9. CAD.Visible = True- C( J7 G  ?+ y8 ~1 C
  10. Set DOC = CAD.ActiveDocument
    ( X; z+ Z8 |* @7 @
  11. Set C = DOC.ModelSpace.AddCircle(P, 100)
复制代码
代码中CAD类名称中包含了版本号,这是因为我电脑中有几个版本的CAD软件,不指定版本号会出错.1 G0 C4 @8 i0 D3 e& z
运行代码,程序打开了CAD2010并在其模型空间画了一个圆,如下图1 F  Q& p7 G& S, ~
0 w0 Z6 G4 o2 l! V( r
Untitled-2.gif ) Z1 m& I, m" K2 q7 P
这种方法叫"前期绑定".它是特点是引用了指定的应用程序类库,使用中只能调用该应用程序软件.* d- C% Z& g, T4 `

2 R2 Z2 a  v: }现在做一下修改
+ y4 Q  p( N" Y! Q' Q) }在"引用"对话框中取消对CAD类库的引用,并把代码中变量声明语句中的CAD对象类型的变量改为Object类型,如下图
5 u6 {2 P2 X' k* J. n Untitled-3.gif
  1. Dim CAD As Object, DOC As Object, C As Object: T3 Q8 q5 q: q. }( [; @- y6 K
  2. Dim P(2) As Double% ]% j' z* Q! N6 K- ^5 \" B1 }* n
  3. On Error Resume Next
    : d9 h: z* e0 Y, h- N
  4. Set CAD = GetObject(, "autocad.application")
    ! K  V( V5 b. z" Q3 `- G* v
  5. If Err Then
    / h3 y+ i6 Q* ]* m+ t  Q3 V
  6. Err.Clear
    ) b' G, v) _. H  R" T
  7. Set CAD = CreateObject("autocad.application")& W) N$ x# x, x
  8. End If
    % w8 }- X1 _* p8 B7 ]
  9. CAD.Visible = True
    9 C) p! M) b0 j: C8 Q; J0 n4 r
  10. Set DOC = CAD.ActiveDocument
    8 e& K4 s( j  A
  11. Set C = DOC.ModelSpace.AddCircle(P, 100)
复制代码
代码中不需要版本号了,因为它能自动绑定到我最后一次使用的我电脑中的CAD版本.2 z: x# R+ m5 D
我运行了CAD2005,然后关掉它.再运行代码,程序打开了CAD2005并在其模型空间画了一个圆,如下图( d1 W3 R- E; [! ~. d: v$ m
Untitled-4.gif : w- D1 G; o1 j( W0 @
这就是所谓"后期绑定",它不针对特定的CAD版本,只要你电脑中有CAD软件就行.. A6 S9 L$ L; N! G  r% T, ]% M) I

1 J( u. q8 G! U+ ]. h) q. r5 T再次修改代码,在其中加上CAD2014的版本号5 j  S0 C9 ]/ c! K& B! u# R
Untitled-5.gif
5 I4 ~$ C+ W" b0 F& B& J# ^
$ s1 z! q3 y- x5 \' Z运行代码的结果是它打开了我的CAD2014,并在其模型空间画了一个圆.因为版本号约束了程序必须调用CAD2014. Untitled-6.gif

桌面.rar

2.84 KB, 下载次数: 7

 楼主| 发表于 2013-11-24 12:59:39 | 显示全部楼层 来自: 中国山东潍坊
woaishuijia,您好!太感激您啦!原来我是一点都不通CAD二次开发的人,最近几个月在您的帮助下我解决了我们这行业很少有人能解决的隔热型材惯性矩计算的问题!谢谢您!
 楼主| 发表于 2013-11-24 13:19:48 | 显示全部楼层 来自: 中国山东潍坊
每次的进步都有热心朋友的支持!这就是学习的乐趣!
 楼主| 发表于 2013-11-24 20:15:26 | 显示全部楼层 来自: 中国山东潍坊
woaishuijia,您好!我试了试!我发现我这个后期绑定不简单,里面相关的地方太多了!我改了改不管用!麻烦您帮检查一下源代码!我发的上一个完全能正常运行!但这个绑定的可能我改得不对!麻烦您帮查查看到底怎么回事!谢谢您!!!

隔热型材面域并集及截面特性计算源文件(后期绑定).rar

2.7 MB, 下载次数: 6

 楼主| 发表于 2013-11-24 20:36:16 | 显示全部楼层 来自: 中国山东潍坊
  woaishuijia版主!您好!我把计算隔热型材惯性矩的过程录像了!用原来的隔热型材面域并集及截面特性计算源文件 横料计算(20131020).rar计算的,我是想让您看到计算的过程!计算结果是正确的,我用手算计算过!但这个的后期绑定我还是搞不定!麻烦您看看我上次发的源代码按照这个录像的操作怎么才能把后期绑定搞定!谢谢您了!问题太多!不好意思老麻烦您!谢谢您!我的QQ515127998

隔热型材惯性矩计算录像.rar

2.09 MB, 下载次数: 5

发表于 2013-11-25 04:36:22 | 显示全部楼层 来自: 中国辽宁
本帖最后由 woaishuijia 于 2013-11-25 05:08 编辑
, S% x$ L5 c& o7 _2 g" o- Y
逆风的香 发表于 2013-11-24 20:15 http://www.3dportal.cn/discuz/static/image/common/back.gif
* P: i  o8 ^* P! S& N+ Ywoaishuijia,您好!我试了试!我发现我这个后期绑定不简单,里面相关的地方太多了!我改了改不管用!麻烦您 ...
7 c; _! N2 g2 C) Q, M, r

% n" q5 s+ W$ P" J& ]"Command1_Click"过程中下图亮显的这一行有错误,应该是你用"查找/替换"时弄错的' g. B: a/ `4 ?& p( C0 G& Q" }9 H
Untitled-4.gif # ]5 o7 U# F8 j6 q8 r- P6 W
这一行改为
  1. AppActivate CAD.Caption
复制代码
就可以了.9 o7 g# v( i, @2 \- A3 W1 M. X
PS:建议你把"CAD","DOC"和"DOCS"三个全局变量改回你以前用过的变量名"acadApp","acadDoc"等,"Command1_Click"过程中的也改回去,否则你其它过程都要改,量太大了* Z! B9 D5 m! J/ @; z  m

( S4 y" c- N$ O* O; t"Command15_Click"过程中有六个CAD类型变量,"Module1"模块的"Xcdm"过程中有两个(见下面四个图中亮显部分),也要改成Object类型,否则计算截面特性时会出错$ w# H( B3 ?" N; N
Untitled-1.gif 8 V: h* ^" V3 ?
Untitled-2.gif
# Z  [% _: t/ } Untitled-3.gif
6 n5 K' u0 t% J8 ] Untitled-8.gif : y4 H2 q+ ~( Q* p, S8 B
0 b' G" V3 S, K# Z
"Command15_Click"过程中还有一个错误,共出现了八处,见下图
3 @" C) O. e8 u7 O Untitled-5.gif
1 q* i( [) }' o$ D"≤"不是VB的运算符,正确的VB运算符"小于或等于"是"<="+ c" R: F9 ^  @# B4 K+ v% M
由于你在VB编辑器中未设置强制变量声明,程序运行到这里时,会把"SSx1≤SSx2"当做一个隐式声明的新变量,默认值为"False".条件判断语句永远执行"Else"后面的部分.
, C: {, p0 `) p4 I3 d8 w
" O+ m6 p: u8 V建议你在现有代码窗口的第一行加上
  1. Option Explicit
复制代码
就像这样
5 ?/ o2 g- L2 H" k3 _ Untitled-6.gif 7 H) `# V  s) R" t3 Z
这会避免很多不必要的错误.
3 R) X0 N7 ]& V1 b在"选项"对话框中把"要求变量声明"复选框勾选上,以后新建代码窗口时,第一行会自动添加"Option Explicit"/ K) W1 t9 f, X* N' a1 h: ~
Untitled-7.gif
 楼主| 发表于 2013-11-25 07:45:07 | 显示全部楼层 来自: 中国山东潍坊
woaishuijia,您好!我做梦也没想到清晨就看到您给的答案!您做事的诚心永远让我这位菜鸟感动!我们搞技术的都有共性,没解决的问题一定要解决掉!谢谢您!
 楼主| 发表于 2013-11-25 09:04:31 | 显示全部楼层 来自: 中国山东潍坊
woaishuijia,您好!麻烦您把调整完的源代码再发给我一下,最好是按“PS:建议你把"CAD","DOC"和"DOCS"三个全局变量改回你以前用过的变量名"acadApp","acadDoc"等,"Command1_Click"过程中的也改回去,否则你其它过程都要改,量太大了! ”这种方式调整完的代码!谢谢您啦!
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

快速回复 返回顶部 返回列表