QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3127|回复: 6
收起左侧

[求助] 关于CAD VBA的问题

[复制链接]
发表于 2008-10-17 19:07:45 | 显示全部楼层 |阅读模式 来自: 中国黑龙江哈尔滨

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

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

x
请问怎样在VBA代码中设置活动的图层,比如当前的活动图层为“层1”,怎样在代码中使活动图层变为“层2”。
0 l$ a  s5 |  z' [+ H前一段时间我问了个堆叠的问题,有两位的回答非常好,在此再次表示感谢!!6 o- u% Q: }  R5 C# A

: N4 F) s. F% e* N- J  B# N还有,能不能预设置MTEXT的对齐方法,比如:先预设Mtext的对齐方法为MC,然后所有的Mtext对象的默认对齐都是居中方式。(在代码中预设)
( W- G# T7 H/ z# Z- u& O
( A" }. w+ `" ]2 U; H: q$ ?[ 本帖最后由 imwey 于 2008-10-17 19:55 编辑 ]
发表于 2008-10-17 20:10:11 | 显示全部楼层 来自: 中国浙江宁波
楼主的问题acad的帮助中就有例程:
. b$ U; m, R4 O+ f7 h1 YSub Example_ActiveLayer()   - d  s7 H* P* M. [
' This example returns the current layer    # r) T  T  J  Q" D
' and then adds a new layer.    ; A2 A& u% N$ G5 s; v
' Finally, it returns the layer to the previous setting.   
4 h' N7 x( o" J. b& k+ |Dim currLayer As AcadLayer    7 x0 f! D& g# H1 h7 ?* K) u
Dim newLayer As AcadLayer        ' Return the current layer of the active document   
: g  @% e. v, M. [- mSet currLayer = ThisDrawing.ActiveLayer   
" C/ Z3 y3 ^$ C) g, e5 G0 D4 h% E; W( dMsgBox "The current layer is " & currLayer.name, vbInformation, "ActiveLayer Example"        
, K5 R6 Y" K  [; x2 }' Create a Layer and make it the active layer   
" x+ w- b+ X9 u* j% f1 D; `$ p9 I0 kSet newLayer = ThisDrawing.Layers.Add("TestLayer")    9 l# w& q2 d7 n5 r* _
ThisDrawing.ActiveLayer = newLayer    2 m2 m# g/ X+ w
MsgBox "The new layer is " & newLayer.name, vbInformation, "ActiveLayer Example"   
  Z5 p. U; L4 J" C6 P; w6 {' Reset the layer to its previous setting   
  `: H6 d% t8 Z! \% |" B& `ThisDrawing.ActiveLayer = currLayer   
" u% z$ O8 h. [/ e0 b9 rMsgBox "The active layer is reset to " & currLayer.name, vbInformation, "ActiveLayer Example"
8 X! G6 }( Z, B. SEnd Sub
* x# f  B/ [+ E& ~9 Z第二个问题建议使用acadText对象,而不是mtext对象,具体参考alignment属性;: g3 Q/ ?/ j9 n+ p2 _9 Z3 H+ f0 |

/ w; s( [; `+ }) `3 z! C2 {5 }[ 本帖最后由 sealive_leafage 于 2008-10-17 20:14 编辑 ]

评分

参与人数 1三维币 +5 收起 理由
woaishuijia + 5 应助

查看全部评分

 楼主| 发表于 2008-10-19 09:58:24 | 显示全部楼层 来自: 中国黑龙江哈尔滨
谢谢楼上的回答,上次我提的问提也是你回答的吧,谢谢。
3 e: }' \% }+ ~8 n. Y1,层的问题,你上面的代码新建一个“TextLayer”,再把它设为活动层。我的本意是问怎么样把一个已存在的层设置问活动,不过我试着把Set newLayer = ThisDrawing.Layers.Add("TestLayer")    中的 testlayer 改为已存在的层的名称,就可以了。这是不是正确的用法?如果不是,应该怎样做?6 m, A$ ^, C/ ?8 U- n9 b
2,因为我要在不同的地方显示文字,而且都要用中间对齐方式,因为mtext和text的默认对齐不是中间,所以我想一次性给设置好,不用每个文字对象都分别设置,嫌麻烦啊。另外,TEXT里面能显示公差吗,因为我要显示公差所以才想起用MTEXT的。, X" Q( z+ T3 |, Y7 P

1 p. {5 j+ a& J8 _7 p3 f/ O# s我是前些天看CAD的开发人员帮助才学的ACAD VBA,所以很菜的,问了这么些菜问题,还请包涵。
发表于 2008-10-19 11:23:00 | 显示全部楼层 来自: 中国辽宁营口

回复 3# imwey 的帖子

一.错误. 2楼的例程中设置活动图层是这行+ D6 b! }2 H- n- A+ m+ Z- F
  1. ThisDrawing.ActiveLayer = newLayer
    2 j- |- n+ L; x8 x
复制代码
在此之前,在
  1. Set newLayer = ThisDrawing.Layers.Add("TestLayer" )
复制代码
这一行(新建"TestLayer"图层)已经将该图层赋值给变量newLayer,所以newLayer就代表"TestLayer"图层对象,所以ThisDrawing.ActiveLayer = newLayer就使"TestLayer"图层成为了活动图层.
' w! }2 ]" \+ d. t7 W+ U把已存在的图层设为活动图层应该这样:
4 t- g" V. t4 i, B" r. y6 j
  1. ThisDrawing.ActiveLayer = ThisDrawing.Layers.Item(图层名称字符串)
    : W! |0 H5 f0 F! m) g0 \
复制代码
当然,如果该图层已经被赋予某个变量,也可以像前面用变量设置活动图层.比如,原有一个名为"实线"的图层:
: E+ y- V! F% i3 E; T, c/ g2 y
  1. Set 图层1 = ThisDrawing.Layers.Item("实线" )
    . w$ a/ W* P# ~' B4 v
  2. ThisDrawing.ActiveLayer = 图层14 g1 j- k; W  h& w1 p" U
复制代码
8 R+ k) S! k; n8 v! q7 Z5 y: N
二.不能! x/ b1 i9 B/ s5 E: ]4 U
属性是从属于对象的,必须分别给每一个mtext或text对象设置属性--如果需要的话
  U" C4 w- B: x5 K3 q/ d% `
3 I, V( O" q8 y% p[ 本帖最后由 woaishuijia 于 2008-10-19 11:29 编辑 ]
 楼主| 发表于 2008-10-19 17:54:38 | 显示全部楼层 来自: 中国黑龙江哈尔滨

; j: ^" L* o( x$ ?* h+ xThisDrawing.ActiveLayer = ThisDrawing.Layers.Item(图层名称字符串) 正是我想要的,哈哈。
) u0 Y* t% @) C8 z假设层“实线”已存在,那么
- q1 ~- X7 D/ S. m1 z' q1 iSet 图层1 = ThisDrawing.Layers.Add("实线" )
/ U% X4 n, n! |1 V" Q8 s
1 F8 O; X" u  ~, D# i1 W/ d" d4 c, BSet 图层1 = ThisDrawing.Layers.Item("实线" )7 I! v9 w# J! ^5 [2 d# H% r: O. y+ e/ I
的效果是不是一样的呢,“图层1”是不是都是指向“实线”?/ t2 D& A4 j$ ~; R6 z# q

9 k  }6 g6 b9 z! Y* S" H可惜mtext和text的默认对齐不是中间对齐,一个一个设置对齐麻烦啊,真的没办法也就只能一个一个设置了。
发表于 2008-10-19 20:38:41 | 显示全部楼层 来自: 中国

回复 5# imwey 的帖子

一、结果是一样的,但前者的写法不规范。图层是命名对象,使用命名对象时不要重名,以避免不必要的错误。
/ y8 q! @9 c7 m% U二、如果你的文字都是中间对齐,可以在最后用循环遍历的方法统一设置它们的对齐属性,这样能减少编程量。比如下面的代码就可以把所有现有的多行文字对象的对正方式设为正中:
  1. Dim SS As AcadSelectionSet, FT(0) As Integer, FD(0) As Variant, MT As AcadMText
    + O* h: `* v# K* r$ J& T. {, L
  2. Set SS = ThisDrawing.SelectionSets.Add("AAAAAA") '新建选择集' X0 D. U6 O! [* a+ r
  3. FT(0) = 0 '定义过滤器为多行文字5 m- C; f. H0 x& i  G
  4. FD(0) = "mtext"
    5 W/ A) @7 |4 I; t3 d: b
  5. SS.Select acSelectionSetAll, , , FT, FD '选择屏幕上全部多行文字对象( m% b0 ~6 Q, `5 Y+ g
  6. For Each MT In SS '遍历多行文字对象2 s9 _3 I1 q- C8 e
  7.     MT.AttachmentPoint = acAttachmentPointMiddleCenter '正中对齐
    7 ]+ q, Z  o4 f5 Z: S$ ?  @6 k
  8. Next7 Q7 L$ z, s1 ~) g5 z
  9. SS.Delete '及时删除用过的选择集
复制代码
 楼主| 发表于 2008-10-21 17:11:50 | 显示全部楼层 来自: 中国黑龙江哈尔滨
谢谢 我爱谁家 和 sealive ,我是现用现学,说不定今后还会有什么问题请教.
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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