QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
8天前
查看: 4958|回复: 12
收起左侧

[原创] 自己做的法兰参数化程序(VBA)

[复制链接]
发表于 2008-7-11 14:35:34 | 显示全部楼层 |阅读模式 来自: 中国江苏南通

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

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

x
Sub falan()0 L9 L6 j( B* v& M" C" M7 P
Dim centerp As Variant '中心坐标) f# M. K4 d/ x5 D+ c/ B
Dim templay As AcadLayer '定义临时层
/ A3 L2 S" G; F; w7 |Dim lay0 As AcadLayer '定义粗实线层) w  B; l2 e* c: Q9 y5 \
Dim lay1 As AcadLayer '定义中心线层
5 w; f  G3 ^8 b6 K- O% _Dim oldlay As AcadLayer '定义原来的层! I+ P+ U8 ^( j+ ?3 G
Dim ent As AcadCircle '定义对象
$ ?  g. g. Y4 O2 Q( j" _$ jOn Error Resume Next/ y" e, \1 m4 D
wj = ThisDrawing.Utility.GetReal("外径(0~10000)<520>") '输入外径尺寸
7 \+ D& a, M0 u" E0 J9 \/ rIf Err.Number <> 0 Then '用户输入的不是有效的数字
3 B+ o2 [+ h/ M0 [7 s& L7 K   wj = 520
3 k, F- M5 B4 e   Err.Clear '清除错误
# D' w# C% m- b- a2 yEnd If: Z. \3 d. ~( H6 y: w; O
nj = ThisDrawing.Utility.GetReal("内径(0~10000)<380>") '输入内径尺寸/ f' d6 V* B2 k! T2 d% c/ s; f9 T
If Err.Number <> 0 Then '用户输入的不是有效的数字
8 i+ j$ b+ i1 r8 s1 l   nj = 380
) A- k. ]9 [  X! A6 P* L) Y   Err.Clear '清除错误& z( D4 m6 `/ T) d0 D
End If
7 Y9 D2 s6 k% d$ f5 ?4 l- nzxj = ThisDrawing.Utility.GetReal("周围孔中心直径(0~10000)<480>") '输入周围孔中心直径尺寸
/ g% p3 {! s% [5 GIf Err.Number <> 0 Then '用户输入的不是有效的数字
# _  x6 z# J" b% I   zxj = 480
" P6 c7 I6 t, C. u# U   Err.Clear '清除错误  v8 K) A2 s# Z0 n& `) E
End If& L5 X9 ]# s5 Y' o/ f: d
kj = ThisDrawing.Utility.GetReal("周围孔径(0~100)<24>") '输入周围孔径尺寸
& M# p+ ?# A! ZIf Err.Number <> 0 Then '用户输入的不是有效的数字
. V5 ]% F/ t- N2 T0 H   kj = 24& x. I  i- c5 k
   Err.Clear '清除错误( Q2 [2 m# J+ p- E) F; j6 Q
End If
/ ~. c5 F+ k& s3 r' G! Ykgs = ThisDrawing.Utility.GetInteger("周围孔个数(0~100)<12>") '输入周围孔个数4 H. T/ v" k/ o4 i% b1 @
If Err.Number <> 0 Then '用户输入的不是有效的数字
( V& S2 b9 P" ^4 k. h+ S( W& [1 p   kgs = 12. p1 E- q( L9 B6 P
   Err.Clear '清除错误9 x7 O6 ?8 h+ J4 l: x. c& t
End If
% \* j9 N, c8 c3 f' C5 wkgs = kgs + 1- M8 j" Q6 [# ~$ u4 _1 N
centerp = ThisDrawing.Utility.GetPoint(, "定位法兰中心:") '设定中心坐标
7 h' y7 r$ N# P1 M  Z. iSet oldlay = ThisDrawing.ActiveLayer '记住当前图层
9 w! S7 f3 V  uFor Each templay In ThisDrawing.Layers '查找图层名为1的图层
. `- U" ~. T, i! I6 E7 p( r    If templay.Name = "1" Then6 w: M9 b& k6 X; f
        Set lay0 = templay '找出图层名为1的为粗线层4 w' _' N7 G3 R* Y! g
    End If
. Q: g4 q+ G* _  L: {4 P' V    If templay.Name = "0" Then
( n+ D& e) j& j( i0 E% v7 {+ m4 f. H        Set lay1 = templay '找出图层名为0的为中心线层
, @& \; k5 ?  G' w    End If+ W8 K5 Q' O3 G( ~
Next templay8 T: b# |0 k# l0 _1 y) x3 b
    ; F3 `# n9 `  }
ThisDrawing.ActiveLayer = lay0 '把当前图层设为粗线层4 n' S) Q, W; J: ], G) j" z+ C
Call ThisDrawing.ModelSpace.AddCircle(centerp, wj / 2) '画外圆圈
# Y; R0 b1 w8 @6 g9 vCall ThisDrawing.ModelSpace.AddCircle(centerp, nj / 2) '画内圆圈, V( [/ t+ _' A# |; R
Set ent = ThisDrawing.ModelSpace.AddCircle(centerp, kj / 2) '画一个小孔4 ~1 e4 z2 W: `; S
Dim centerm(0 To 2) As Double '移动坐标5 n3 \- w: L! `6 ?. @) ?8 [
centerm(0) = centerp(0): centerm(1) = centerp(1) + zxj / 2: centerm(2) = centerp(2), [6 |" G- [3 [% e4 C

' V# o9 O: d" SDim rent As Variant1 e% L  }3 L7 }
ent.Move centerp, centerm
; i" o- P; _1 j4 i5 f'rent = ent.ArrayPolar(kgs, 2 * pi, centerp)
. U; U9 S0 L, o8 d& o- ?) }ent.ArrayPolar kgs, 2 * 3.1415926, centerp& B0 R+ e2 x$ {( J

3 v# G- w# c3 `! L& y. Y! BThisDrawing.ActiveLayer = lay1 '把当前图层设为中心线层0 A2 P2 I, b, g
Call ThisDrawing.ModelSpace.AddCircle(centerp, zxj / 2) '画外圆圈
6 H. v1 S: C& b- T! E9 l" w% pDim clpoint1(0 To 2) As Double '坐标: o. _/ E1 C# E
Dim clpoint2(0 To 2) As Double '坐标
( ^( C5 ^$ z# n% o2 C9 i3 X9 Zclpoint1(0) = centerp(0) - 10 - wj / 2: clpoint1(1) = centerp(1): clpoint1(2) = centerp(2)
9 r" N/ ^  B9 ]8 @* x; D; G1 Vclpoint2(0) = centerp(0) + 10 + wj / 2: clpoint2(1) = centerp(1): clpoint2(2) = centerp(2)* w+ n+ B" x9 G# N" T; y0 D
Call ThisDrawing.ModelSpace.AddLine(clpoint1, clpoint2)  |' e* n) I8 C; K( e
clpoint1(0) = centerp(0): clpoint1(1) = centerp(1) - 10 - wj / 2: clpoint1(2) = centerp(2)
: M+ O4 K4 c% Uclpoint2(0) = centerp(0): clpoint2(1) = centerp(1) + 10 + wj / 2: clpoint2(2) = centerp(2)
, P% s/ l+ e# t* U2 L+ w' xCall ThisDrawing.ModelSpace.AddLine(clpoint1, clpoint2)
- F4 A8 N, c4 g8 O2 ]" U3 ]* y$ Kclpoint1(0) = centerp(0): clpoint1(1) = ent.Center(1) - 10 - kj / 2: clpoint1(2) = centerp(2)( {& g, c: C! x6 Z7 {
clpoint2(0) = centerp(0): clpoint2(1) = ent.Center(1) + 10 + kj / 2: clpoint2(2) = centerp(2)0 K% r* s/ V6 Z
Dim lent As AcadLine- Z% W" U$ K( z$ i8 I0 k: t7 L
Set lent = ThisDrawing.ModelSpace.AddLine(clpoint1, clpoint2)8 Q' ]' ^0 l- y4 z6 i
lent.ArrayPolar kgs, 2 * 3.1415926, centerp/ {) {. l& g4 p  I4 _. `/ k) O
lent.Delete
! l( |6 N) B; m4 c( d5 C, ient.Delete
, ~7 c" t+ c$ H, oThisDrawing.ActiveLayer = oldlay '把当前图层还原
+ c+ E. P' A8 ^ZoomExtents '显示整个图形6 w9 @2 z) p& U' c$ @
End Sub

学习VBA.rar

20.59 KB, 下载次数: 95

评分

参与人数 1三维币 +3 收起 理由
woaishuijia + 3 鼓励一下

查看全部评分

 楼主| 发表于 2008-7-11 14:44:45 | 显示全部楼层 来自: 中国江苏南通
没人顶,路过的,发表点看法啊,给初学者点信心
发表于 2008-7-11 15:59:31 | 显示全部楼层 来自: 中国辽宁营口
这个程序如果自用,已经完全可以了。如果共享则还有些不太合理的地方:/ H: l2 Z7 ]/ `) z' B6 u! O: L( F
1、, ~: h) U. S" z$ R1 {
wj = ThisDrawing.Utility.GetReal("外径(0~10000)<520>") '输入外径尺寸9 x7 f  r* U* h; j
If Err.Number <> 0 Then '用户输入的不是有效的数字" o. \1 F( L* e9 \+ ?4 {  m# |
wj = 520
9 w: b$ T# j4 a% X( G' ^  tErr.Clear '清除错误! k! g2 n+ l. |3 q3 W. v" [$ |! V
End If
0 {+ {  q) x- d及后面类似获取数值的部分3 M. K8 N7 p5 a# t! p9 ^7 p4 B
如果用户输入的是负值怎么办?如果用户想按“Esc”退出命令怎么办?. d+ W$ U2 Z1 n

% s: U! ]# [4 U' ^2 j2、
9 h$ r- n% J5 U* Rcenterp = ThisDrawing.Utility.GetPoint(, "定位法兰中心:") '设定中心坐标' F8 t  @/ H; b% K
如果用户没有输入点坐标而直接按回车、空格或按“Esc”怎么办?4 F; I4 ]& a* Z4 ^$ H6 {
. X- `1 I; E+ A/ \, x$ r. W
还有一些小的瑕疵,比如:# x! O9 @  K: u
Set ent = ThisDrawing.ModelSpace.AddCircle(centerp, kj / 2) '画一个小孔8 G1 ^! Y5 h1 b
Dim centerm(0 To 2) As Double '移动坐标
4 |9 N/ m: f+ A3 e+ M; x0 W! {centerm(0) = centerp(0): centerm(1) = centerp(1) + zxj / 2: centerm(2) = centerp(2)
4 T1 T3 w5 j1 Y+ X3 Yent.Move centerp, centerm* h( D/ v; t+ x
为什么不直接把小孔画在centerm呢?
% z0 W1 X/ e4 u1 v+ n% b8 m0 x- f, k; G9 W; ?$ j" M3 W: Z  c
还有,建议你把VBA编辑器中“选项”对话框下“编辑器”选项卡的“要求变量声明”勾选上,以后不要用隐式声明变量,这可以避免低级错误。
2 H6 C; C. d/ {! W) j: }1 ^& t$ [5 }/ T0 @9 t* L
友情提示:“GetReal”、“GetInteger”和“GetPoint”方法按下空格或回车的错误代码是-2145320928
发表于 2008-7-14 22:20:51 | 显示全部楼层 来自: 中国天津
试验了一下,功能还可以,鼓励一下。
头像被屏蔽
发表于 2008-7-16 13:40:24 | 显示全部楼层 来自: 中国江苏南京
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2008-9-19 23:04:07 | 显示全部楼层 来自: 中国江苏苏州
楼主好心人,我急用呢
发表于 2009-1-7 03:28:56 | 显示全部楼层 来自: 中国新疆克拉玛依
厉害厉害!!!
发表于 2009-1-7 03:29:40 | 显示全部楼层 来自: 中国新疆克拉玛依
看了楼主发的这个程序后,自己感触很深~!!
发表于 2011-9-8 14:32:46 | 显示全部楼层 来自: 中国上海
好东西 谢谢楼主分享  正需要
发表于 2011-11-4 21:25:30 | 显示全部楼层 来自: 中国辽宁营口
很好,顶一下,还要改进一下就好了
发表于 2011-11-12 18:51:02 | 显示全部楼层 来自: 中国湖北潜江
我觉得这种参数化的设计还是在三维里搞更方便快捷一些
发表于 2012-4-19 13:42:18 | 显示全部楼层 来自: 中国湖南岳阳
能否出个画法兰剖视图的VBA程序出来啊?
发表于 2012-4-20 21:56:07 | 显示全部楼层 来自: 中国青海西宁
楼主,这个怎么用啊。多谢指教,我把它复制到命令栏后还是不能用啊,能不能上个详细的安装步骤啊
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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