Option Explicit: k7 w; P* b' r( |9 T+ ?6 X 
 
( T8 |6 v0 k: O8 W& Z, ^3 v3 ePrivate Sub Check3_Click(); A8 A, \4 u( u" g/ { 
If Check3.Value = 1 Then* X8 o; G( j7 W0 B6 s' ?# A1 R 
    cboBlkDefs.Enabled = True6 r5 Q5 m3 `3 \% v: P% n 
Else7 ]$ E# M/ F7 w7 F 
    cboBlkDefs.Enabled = False0 l; j6 e. R  N: j8 Q 
End If' I; v: V: a/ J/ u/ j' T8 E' E6 { 
End Sub 
) q7 Z  z& F. e* \: ^+ E% u0 ]* S9 p+ P7 q: | 
Private Sub Command1_Click() 
, x$ W7 d! S! j: I) m& ~Dim sectionlayer As Object '图层下图元选择集3 [& a7 d* d3 {6 s* J 
Dim i As Integer 
1 U1 g8 P* G  h. vIf Option1(0).Value = True Then 
% B. t  d( e1 f. i- O    '删除原图层中的图元 
# c) ~9 z% E1 f% s/ I    Set sectionlayer = FilterSSet("sectionlayer", 8, "插入模型页码", 67, "0") '得到图层下图元- P6 t- s- M* D! \ 
    sectionlayer.erase 
. g) k( d0 q, x: P    sectionlayer.Delete 
; P4 K  ?) |& |! d- |" w0 p  E    Call AddYMtoModelSpace5 J' q. F2 e0 l 
Else 
# b4 G2 q* V" F4 l1 G& o    Set sectionlayer = FilterSSet("sectionlayer", 8, "插入布局页码", 67, "1") '得到图层下图元9 t5 k" K! D2 O3 c2 ]7 } 
    '注意:这里必须用循环的方法删除,不能用sectionlayer.erase,因为多个布局会发生错误 
! P; ^2 l, J7 c. J( o  }# @    If sectionlayer.count > 0 Then 
7 e* F+ R* `" i  i        For i = 0 To sectionlayer.count - 1& \% h& q, O/ ~" w1 W" X 
            sectionlayer.Item(i).Delete 
9 Y) s8 m' n# b" P$ z0 E  U        Next 
0 g" q% {6 k* m' J8 z, ?    End If- w  B7 _' ^- ~# z 
    sectionlayer.Delete0 }& q: E8 {  g9 ^2 _4 J 
    Call AddYMtoPaperSpace 
0 N: {! S5 n# X! SEnd If9 n2 b( X3 [* v& ?  } 
End Sub 
8 P% q8 d  u. d7 T& H. TPrivate Sub AddYMtoPaperSpace() 
+ \- H! j( \& ~; t0 Z: |6 Q7 S0 [/ p0 @4 p7 [. x6 F- K! N/ Q0 M9 N 
    Dim sectionText As Object, sectionMText As Object, i As Integer, anobj As Object 
8 u* u9 o8 C0 s) k; h- ^- n    Dim ArrObjs() As Object, ArrLayoutNames() As String, ArrTabOrders() As Integer '第X页的信息 
: o9 a. f& c. {8 y: _; u    Dim ArrObjsAll() As Object, ArrLayoutNamesAll() As String '共X页的信息 
- R8 u; h( y6 q, I5 V0 }    Dim flag As Boolean '是否存在页码: E5 l( p, t$ s, Z# K' k7 }. ?! ] 
    flag = False6 y( G  J0 t4 V; H; j# i 
    '定义三个数组,分别放置页码对象、页码对象所在布局的标签名、页码对象所在的标签在所有标签中的位置) v& W# I5 I& E 
    If Check1.Value = 1 Then 
3 D0 A5 M$ V  N' Y/ c        '加入单行文字, U# y: W" ]. a/ I% a, X 
        Set sectionText = FilterSSet("sectionText", 67, "1", 0, "TEXT") '得到text 
0 q  q' ?* x9 X$ p  S        For i = 0 To sectionText.count - 1* N! {! N5 o0 \1 q" t& r 
            Set anobj = sectionText(i)$ W+ E: p' [5 H/ J1 o4 B! m 
            If VBA.Left(Trim(anobj.textString), 1) = "第" And VBA.Right(Trim(anobj.textString), 1) = "页" Then 
' p) q# @0 s. h" ]" ~                '把第X页增加到数组中4 M8 y7 e' }5 u0 F8 M 
                Call Getowner(anobj, ArrObjs, ArrLayoutNames, ArrTabOrders)4 @% i7 n- A6 n: _4 N 
                flag = True 
( ~5 F' W5 O1 p* c# s5 p            ElseIf VBA.Left(Trim(anobj.textString), 1) = "共" And VBA.Right(Trim(anobj.textString), 1) = "页" Then: Y% z0 l5 @1 P3 b1 S 
                '把共X页增加到数组中 
8 n1 z6 `: U- e  c% `                Call GetownerAll(anobj, ArrObjsAll, ArrLayoutNamesAll) 
. `# ^: H+ N; s5 C& V" J$ k            End If 
: P* N, O0 @' Q        Next 
' g7 P, b- z( q! v0 a8 E# N3 E# Q    End If 
! {# C; i; o. Z     
2 B8 k* G) q4 ?# H9 ^" T5 t    If Check2.Value = 1 Then' ?1 R4 H& ]: W 
        '加入多行文字 
  j) [1 M/ W. e2 S' U. Z$ v! ~        Set sectionMText = FilterSSet("sectionMText", 67, "1", 0, "MTEXT") '得到Mtext 
2 N! c! E: ?# U8 ^: s* W1 \1 m3 @        For i = 0 To sectionMText.count - 1 
. j) b# ^/ d5 r7 p" b0 n& u, M            Set anobj = sectionMText(i) 
# H- m, o: ?& ]/ H3 y            If VBA.Left(Trim(anobj.textString), 1) = "第" And VBA.Right(Trim(anobj.textString), 1) = "页" Then 
( X" m$ Z2 p* [3 \8 a                '把第X页增加到数组中: }  }2 y- [4 E 
                Call Getowner(anobj, ArrObjs, ArrLayoutNames, ArrTabOrders) 
  z4 ^2 [0 V2 y, u& o5 o/ O; I                flag = True 
0 h7 U; ^" \6 h8 X2 Y6 A0 L  e. I            ElseIf VBA.Left(Trim(anobj.textString), 1) = "共" And VBA.Right(Trim(anobj.textString), 1) = "页" Then0 Q1 Z8 H6 H, p- U/ a 
                '把共X页增加到数组中 
; ^7 g. g6 [- V' q9 @                Call GetownerAll(anobj, ArrObjsAll, ArrLayoutNamesAll)" y% s( q9 H# _" j6 \; `$ ^: V 
            End If 
( `2 G4 p. S. J' r3 ]        Next 
5 Z$ V. l; C' B4 H; c% B6 F    End If0 S8 D& Y3 V: o+ u 
    6 ^) L4 e2 p8 A. W 
    '判断是否有页码4 X6 [% Y  b2 |* t 
    If flag = False Then 
" ~% x9 ]+ Y2 }& C5 B: ?* L        MsgBox "没有找到页码"+ {( e% I! ]( c3 D& k! f 
        Exit Sub3 ]. y+ i: l5 f9 v/ J) h) p! b0 \ 
    End If 
5 f! j$ L6 w* @% P: ^    , x% C8 D* L4 m& J3 U" P+ A 
    '得到了3个数组,接下来根据ArrLayoutNames得到对应layout.item(i)中的i, 
9 @. v9 i4 f4 g6 L    Dim ArrItemI As Variant, ArrItemIAll As Variant 
/ ~& {: C/ H$ x. J4 h2 Q    ArrItemI = GetNametoI(ArrLayoutNames) 
# D) Q! ?8 h/ G% g  ^' u    ArrItemIAll = GetNametoI(ArrLayoutNamesAll)$ u; j4 y5 r6 R' y0 f2 a; s 
    '接下来按照ArrTabOrders里面的数字按从小到大排列其他两个数组ArrItemI及ArrObjs 
" I9 }7 F+ z1 a0 c* z    Call PopoArr(ArrTabOrders, ArrObjs, ArrItemI) 
1 S4 |& `) e) l: |    ) _; M. [  d5 ^' { 
    '接下来在布局中写字 
+ b& X0 Q/ T0 c0 g    Dim minExt As Variant, maxExt As Variant, midExt As Variant3 z/ [% _1 b8 f3 s. C 
    '先得到页码的字体样式# b9 e3 c. A  E7 b! q 
    Dim tempname As String, tempheight As Double  m% V& |% \) j6 O6 A5 i5 b 
    tempname = ArrObjs(0).stylename 
6 x+ g* l- O9 E* e    tempheight = ArrObjs(0).Height+ j! O& P1 H: q8 M$ a 
    '设置文字样式 
, T( k7 C7 m& j, M% |1 U    Dim currTextStyle As Object7 F3 c/ f; E# \3 {8 W* a- f1 b5 ] 
    Set currTextStyle = ThisDrawing.TextStyles(tempname) 
/ n5 g* ?$ `& _0 R1 `    ThisDrawing.ActiveTextStyle = currTextStyle '设置当前文字样式) D7 J# a7 m6 b1 K' } 
    '设置图层 
7 i; y- Y4 T: E2 k- l    Dim Textlayer As Object& R# [3 [5 X( {7 d9 M, {5 ` 
    Set Textlayer = ThisDrawing.Layers.Add("插入布局页码") 
- t3 V5 c$ {$ j7 x* j  l9 V$ c    Textlayer.Color = 1 
& i& e- q; m! V& E$ V: W$ g    ThisDrawing.ActiveLayer = Textlayer 
6 L) S- E" b# b, n+ @4 v    '得到第x页字体中心点并画画9 c. T" i* g2 C& ` 
    For i = 0 To UBound(ArrObjs)$ B; i* P( E5 B0 K$ y' x 
        Set anobj = ArrObjs(i) 
4 Y4 m+ `" D' D& o, [! g/ v        Call GetBounding(anobj, minExt, maxExt) '得到所写字体的外边框左下角和右上角的坐标- S2 U5 H& B' y  ] 
        midExt = centerPoint(minExt, maxExt) '得到中心点4 _; r3 M8 N  Y' W$ A: B/ g1 _5 p 
        Call AcadText_paperspace(i + 1, midExt, tempheight, ArrItemI(i)) 
6 ?7 C4 K) ~+ |    Next 
% }7 l4 {3 J- p: Z, u/ R8 C" X    '得到共x页字体中心点并画画 
; g1 k* \0 O: v& S0 }. n# r8 i$ t    Dim tempi As String8 d; A/ l: y. a; @8 H 
    tempi = UBound(ArrObjsAll) + 1: W( q' p, `/ z 
    For i = 0 To UBound(ArrObjsAll)7 Q7 d" `: J$ x8 B! B  A+ a 
        Set anobj = ArrObjsAll(i)' Q- L. C" d) h1 i 
        Call GetBounding(anobj, minExt, maxExt) '得到所写字体的外边框左下角和右上角的坐标; e6 i# d! M2 O  e7 w7 [ 
        midExt = centerPoint(minExt, maxExt) '得到中心点2 [8 C5 I5 z! }& C 
        Call AcadText_paperspace(tempi, midExt, tempheight, ArrItemIAll(i))  j$ K+ W7 t- p, Z! N* k 
    Next 
, d( ^" z$ d. M3 ^# @    , t* S. r8 k' v2 t9 |. F. v 
    MsgBox "OK了"2 ^! h8 @$ P" {+ N% v/ z% D 
End Sub% \8 s/ l! F" F  S8 p' n, B3 w2 f 
'得到某的图元所在的布局 
( h# C* L& V5 [9 g6 N3 x' A  i! o'入口:图元。及图元的相关信息数组,出口:增加一个信息后的数组" p1 i4 h3 {- G) A7 ?" [ 
Sub Getowner(ent As Object, ArrObjs, ArrLayoutNames, ArrTabOrders)+ Y7 [* v% b" t# y' \( P  Y 
/ \) s! k4 J) O1 q6 q1 f 
Dim owner As Object; h6 ~/ \8 _2 z. ~9 H 
Set owner = ThisDrawing.ObjectIdToObject(ent.OwnerID) 
* B, t0 ?' G1 X0 ^3 pIf IsArrayEmpty(ArrLayoutNames) = True Then '如果是第一个4 E, q( h1 w) q1 f+ |$ s 
    ReDim ArrObjs(0)+ \2 v! r% o+ B4 D6 B3 [* V: R" J 
    ReDim ArrLayoutNames(0)3 T% c9 t, k. T/ O 
    ReDim ArrTabOrders(0) 
) H8 K0 I! A( v    Set ArrObjs(0) = ent# a9 c+ K0 Y8 i1 N 
    ArrLayoutNames(0) = owner.Layout.Name. W* a8 Q$ o& o. ] 
    ArrTabOrders(0) = owner.Layout.TabOrder! O6 P5 D0 W. S8 |/ F0 | 
Else 
2 _2 q; \- j+ b; B% W& h6 b    ReDim Preserve ArrObjs(UBound(ArrObjs) + 1) '增加一个 
1 K! t3 e, ]% G' N& E. n) ?- S9 y% s    ReDim Preserve ArrLayoutNames(UBound(ArrLayoutNames) + 1) '增加一个2 X5 [* L3 |1 G4 y3 w 
    ReDim Preserve ArrTabOrders(UBound(ArrTabOrders) + 1) '增加一个( w9 a  R: B# Y' i: t7 E2 W 
    Set ArrObjs(UBound(ArrObjs)) = ent 
) o, A3 x% ^1 l7 x" g    ArrLayoutNames(UBound(ArrLayoutNames)) = owner.Layout.Name 
3 f& p  X' I' w7 `4 l    ArrTabOrders(UBound(ArrTabOrders)) = owner.Layout.TabOrder* W' l, u+ I9 o4 `( D3 c 
End If$ o9 d5 [; S" T, Y 
End Sub 
' j  y4 v$ T$ {. ~1 U'得到某的图元所在的布局! d3 u. `- Y( w8 M" B- u; _ 
'入口:图元。及图元的相关信息数组,出口:增加一个信息后的数组 
+ I9 p1 H3 ^% V! ~9 z2 f0 o( WSub GetownerAll(ent As Object, ArrObjs, ArrLayoutNames)  [7 b. r; X1 m' d! P' u 
 
7 t/ n- y5 A' \Dim owner As Object1 n0 k0 b) q9 @% c) \1 p+ U 
Set owner = ThisDrawing.ObjectIdToObject(ent.OwnerID) 
/ t2 X4 s) M5 D7 W, BIf IsArrayEmpty(ArrLayoutNames) = True Then '如果是第一个 
! a/ h! v# P7 E% h& d+ o/ W    ReDim ArrObjs(0)* N5 b! A' ?+ I. {% Q 
    ReDim ArrLayoutNames(0)2 p6 f9 j( v* A& s6 s 
    Set ArrObjs(0) = ent 
' [+ _+ h* b- Y    ArrLayoutNames(0) = owner.Layout.Name 
0 E7 W; @2 i8 T; O9 iElse 
4 l$ i) r, s2 ]7 O  d9 ^  {1 |    ReDim Preserve ArrObjs(UBound(ArrObjs) + 1) '增加一个 
5 p8 |# X+ x- v4 K: R( {2 Q    ReDim Preserve ArrLayoutNames(UBound(ArrLayoutNames) + 1) '增加一个 
% \' @0 h/ z9 W) f! V: k    Set ArrObjs(UBound(ArrObjs)) = ent 
- M: M) A# R% T/ `! d( m    ArrLayoutNames(UBound(ArrLayoutNames)) = owner.Layout.Name 
, r4 k. Q3 z! ^! o: D: h* E5 REnd If 
: H6 p; y% Q, D4 ?5 b0 MEnd Sub 
  o$ M$ A4 c( [. J  E; aPrivate Sub AddYMtoModelSpace()8 N8 x" Y4 F+ G% @; N. E" O; }/ D 
    Dim sectionText As Object, sectionMText As Object, sectionBlock As Object, SSetobjBlkDefText As Object '图块中文字的集合 
' |0 a4 B8 ~# p6 X( K) J" p6 x7 g    If Check1.Value = 1 Then Set sectionText = FilterSSet("sectionText", 0, "TEXT", 67, "0") '得到text 
* N! x, c7 Q) Q4 w9 l    If Check2.Value = 1 Then Set sectionMText = FilterSSet("sectionMText", 0, "MTEXT", 67, "0") '得到Mtext 
0 b! Z* ?. F6 i. [- @" e0 p8 W    If Check3.Value = 1 Then 
, G" k. ]' S3 O        If cboBlkDefs.Text = "全部" Then 
; F  H0 a+ s* w7 ^            Set sectionBlock = FilterSSet("sectionBlock ", 0, "INSERT", 67, "0") '得到插入的BLOCK.0表示模型,1 表示布局中的图元 
. G( |$ v  b, c' k. ]+ m/ k9 ?        Else 
- a( o* z2 A0 V( T# j3 [3 \4 V* y            Set sectionBlock = FilterSSet("sectionBlock ", 0, "INSERT", 67, "0", 2, cboBlkDefs.Text)  a2 J, L  x4 i# I1 e/ O 
        End If- l& G, C' t2 t 
        Set SSetobjBlkDefText = CreateSelectionSet("SSetobjBlkDefText")0 Y) e+ _; G1 c* f' ^ 
        Set SSetobjBlkDefText = AddbjBlkDeftextToSSet(sectionBlock) '得到当前N多块的text的选择集" }8 t) ^2 _: s0 h2 L3 I 
    End If 
2 s; B* A5 z- g5 f2 U 
- ]: P, H7 T- }. z" ?" ]    Dim i As Integer 
; q) T0 A8 O9 C6 p$ E9 }    Dim minExt As Variant, maxExt As Variant, midExt As Variant 
. G$ x; a' ^9 M( B; X    4 G. }4 X; f' w5 r 
    '先创建一个所有页码的选择集# P) i- F2 `6 f" B/ I  j 
    Dim SSetd As Object '第X页页码的集合 
; F" k4 p1 G& W, F    Dim SSetz As Object '共X页页码的集合 
+ F! ~( \  ?8 k" S- {     
1 c% C' R' z0 o; }$ E7 S    Set SSetd = CreateSelectionSet("sectionYmd") 
% S# I1 w  t! M9 w; T    Set SSetz = CreateSelectionSet("sectionYmz") 
- m- C) _" w  [4 a+ k& m- n  y* G. c 
    '接下来把文字选择集中包含页码的对象创建成一个页码选择集 
+ j4 F. O6 ?! d6 q9 S- c7 O0 {  M2 X. s    Call AddYmToSSet(SSetd, SSetz, sectionText)* b% {- a+ B& w7 Y1 V 
    Call AddYmToSSet(SSetd, SSetz, sectionMText)& A8 c& H2 y- } 
    Call AddYmToSSet(SSetd, SSetz, SSetobjBlkDefText)) d# {# m- t, `: a* w 
8 N: u+ Z, q* Y( H! o 
     
' Q2 I  `/ V, z    If SSetd.count = 0 Then+ z/ a& ?0 v+ M& W1 l- p 
        MsgBox "没有找到页码", A! b, y  c) V( z! s5 E 
        Exit Sub- _7 c3 ~9 f9 C6 b0 R0 H( e( v 
    End If 
1 `7 j, G8 r" P) ^; d9 K   1 p8 P2 k4 K; S8 r7 N% m! f 
    '选择集输出为数组然后排序. f7 b' H- u8 L7 z. ? 
    Dim XuanZJ As Variant 
5 Q. Q0 W) F/ T8 R9 q0 L" ^) J    XuanZJ = ExportSSet(SSetd)/ A. ]: \6 r$ u/ Z 
    '接下来按照x轴从小到大排列 
; o8 i& N' q0 r' S7 ~2 Y0 d. D% O! v! k    Call PopoAsc(XuanZJ) 
+ S5 v; w; `) \    % |, C( K& y' E 
     '把不用的选择集删除6 c0 S1 m; T  q 
    SSetd.Delete/ r: l( Z& z, E 
    If Check1.Value = 1 Then sectionText.Delete5 Y$ Z: A! B$ c6 v 
    If Check2.Value = 1 Then sectionMText.Delete0 [+ U' J+ v! g+ I9 o& [/ X: Q: i( p 
" V; @+ V  E1 ]4 P 
    8 F* T; k8 ~4 o 
    '接下来写入页码 |