|  | @@ -2,23 +2,23 @@ Attribute VB_Name = "Tools"
 | 
	
		
			
				|  |  |  Public Sub 填入居中文字(Str)
 | 
	
		
			
				|  |  |    Dim s As Shape
 | 
	
		
			
				|  |  |    Set s = ActiveSelection
 | 
	
		
			
				|  |  | -  x = s.CenterX
 | 
	
		
			
				|  |  | +  X = s.CenterX
 | 
	
		
			
				|  |  |    Y = s.CenterY
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    Set s = ActiveLayer.CreateArtisticText(0, 0, Str)
 | 
	
		
			
				|  |  | -  s.CenterX = x
 | 
	
		
			
				|  |  | +  s.CenterX = X
 | 
	
		
			
				|  |  |    s.CenterY = Y
 | 
	
		
			
				|  |  |  End Sub
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Public Sub 尺寸标注()
 | 
	
		
			
				|  |  |    ActiveDocument.Unit = cdrMillimeter
 | 
	
		
			
				|  |  |    Set s = ActiveSelection
 | 
	
		
			
				|  |  | -  x = s.CenterX: Y = s.TopY
 | 
	
		
			
				|  |  | +  X = s.CenterX: Y = s.TopY
 | 
	
		
			
				|  |  |    sw = s.SizeWidth: sh = s.SizeHeight
 | 
	
		
			
				|  |  |          
 | 
	
		
			
				|  |  |    Text = Int(sw) & "x" & Int(sh) & "mm"
 | 
	
		
			
				|  |  |    Set s = ActiveLayer.CreateArtisticText(0, 0, Text)
 | 
	
		
			
				|  |  | -  s.CenterX = x: s.BottomY = Y + 5
 | 
	
		
			
				|  |  | +  s.CenterX = X: s.BottomY = Y + 5
 | 
	
		
			
				|  |  |  End Sub
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Public Sub 批量居中文字(Str)
 | 
	
	
		
			
				|  | @@ -26,10 +26,10 @@ Public Sub 
 | 
	
		
			
				|  |  |    Set sr = ActiveSelectionRange
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    For Each s In sr.Shapes
 | 
	
		
			
				|  |  | -    x = s.CenterX: Y = s.CenterY
 | 
	
		
			
				|  |  | +    X = s.CenterX: Y = s.CenterY
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      Set s = ActiveLayer.CreateArtisticText(0, 0, Str)
 | 
	
		
			
				|  |  | -    s.CenterX = x: s.CenterY = Y
 | 
	
		
			
				|  |  | +    s.CenterX = X: s.CenterY = Y
 | 
	
		
			
				|  |  |    Next
 | 
	
		
			
				|  |  |  End Sub
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -38,12 +38,12 @@ Public Sub 
 | 
	
		
			
				|  |  |    Set sr = ActiveSelectionRange
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    For Each s In sr.Shapes
 | 
	
		
			
				|  |  | -    x = s.CenterX: Y = s.TopY
 | 
	
		
			
				|  |  | +    X = s.CenterX: Y = s.TopY
 | 
	
		
			
				|  |  |      sw = s.SizeWidth: sh = s.SizeHeight
 | 
	
		
			
				|  |  |            
 | 
	
		
			
				|  |  |      Text = Int(sw + 0.5) & "x" & Int(sh + 0.5) & "mm"
 | 
	
		
			
				|  |  |      Set s = ActiveLayer.CreateArtisticText(0, 0, Text)
 | 
	
		
			
				|  |  | -    s.CenterX = x: s.BottomY = Y + 5
 | 
	
		
			
				|  |  | +    s.CenterX = X: s.BottomY = Y + 5
 | 
	
		
			
				|  |  |    Next
 | 
	
		
			
				|  |  |  End Sub
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -53,39 +53,18 @@ Public Sub 
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    For Each s In brk1
 | 
	
		
			
				|  |  |      Set sh = ActivePage.SelectShapesFromRectangle(s.LeftX, s.TopY, s.RightX, s.BottomY, True)
 | 
	
		
			
				|  |  | -    sh.Shapes.All.Group
 | 
	
		
			
				|  |  | +    sh.Shapes.All.group
 | 
	
		
			
				|  |  |      s.Delete
 | 
	
		
			
				|  |  |    Next
 | 
	
		
			
				|  |  |  End Sub
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Private Function 对角线角度(x1 As Double, y1 As Double, x2 As Double, y2 As Double) As Double
 | 
	
		
			
				|  |  | -  pi = 4 * VBA.Atn(1) ' 计算圆周率'
 | 
	
		
			
				|  |  | -  对角线角度 = VBA.Atn((y2 - y1) / (x2 - x1)) / pi * 180
 | 
	
		
			
				|  |  | -End Function
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Public Sub 角度转平()
 | 
	
		
			
				|  |  | -  ActiveDocument.ReferencePoint = cdrCenter
 | 
	
		
			
				|  |  | -  Dim sr As ShapeRange '定义物件范围
 | 
	
		
			
				|  |  | -  Set sr = ActiveSelectionRange
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Dim x1 As Double, y1 As Double, x2 As Double, y2 As Double
 | 
	
		
			
				|  |  | -  Dim Shift As Long
 | 
	
		
			
				|  |  | -  Dim b As Boolean
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  b = ActiveDocument.GetUserArea(x1, y1, x2, y2, Shift, 10, False, 306)
 | 
	
		
			
				|  |  | -  If Not b Then
 | 
	
		
			
				|  |  | -    a = 对角线角度(x1, y1, x2, y2)
 | 
	
		
			
				|  |  | -    sr.Rotate -a
 | 
	
		
			
				|  |  | -  End If
 | 
	
		
			
				|  |  | -End Sub
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ' 实践应用: 选择物件群组,页面设置物件大小,物件页面居中
 | 
	
		
			
				|  |  |  Public Function 群组居中页面()
 | 
	
		
			
				|  |  |    ActiveDocument.Unit = cdrMillimeter
 | 
	
		
			
				|  |  |    Dim OrigSelection As ShapeRange, sh As Shape
 | 
	
		
			
				|  |  |    Set OrigSelection = ActiveSelectionRange
 | 
	
		
			
				|  |  | -  Set sh = OrigSelection.Group
 | 
	
		
			
				|  |  | +  Set sh = OrigSelection.group
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    ' MsgBox "选择物件尺寸: " & sh.SizeWidth & "x" & sh.SizeHeight
 | 
	
		
			
				|  |  |    ActivePage.SetSize Int(sh.SizeWidth + 0.9), Int(sh.SizeHeight + 0.9)
 | 
	
	
		
			
				|  | @@ -203,7 +182,10 @@ Public Function 
 | 
	
		
			
				|  |  |    Debug.Print Str
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    Dim s1 As Shape
 | 
	
		
			
				|  |  | -  Set s1 = ActiveLayer.CreateParagraphText(0, 0, 100, 150, Str, Font:="华文中宋")
 | 
	
		
			
				|  |  | +' Set s1 = ActiveLayer.CreateParagraphText(0, 0, 100, 150, Str, Font:="华文中宋")
 | 
	
		
			
				|  |  | +  X = ssr.FirstShape.LeftX - 100
 | 
	
		
			
				|  |  | +  Y = ssr.FirstShape.TopY
 | 
	
		
			
				|  |  | +  Set s1 = ActiveLayer.CreateParagraphText(X, Y, X + 90, Y - 150, Str, Font:="华文中宋")
 | 
	
		
			
				|  |  |  End Function
 | 
	
		
			
				|  |  |   
 | 
	
		
			
				|  |  |  '// 实现Excel里分类汇总功能
 | 
	
	
		
			
				|  | @@ -237,4 +219,290 @@ Private Function 
 | 
	
		
			
				|  |  |  End Function
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +' 两个端点的坐标,为(x1,y1)和(x2,y2) 那么其角度a的tan值: tana=(y2-y1)/(x2-x1)
 | 
	
		
			
				|  |  | +' 所以计算arctan(y2-y1)/(x2-x1), 得到其角度值a
 | 
	
		
			
				|  |  | +' VB中用atn(), 返回值是弧度,需要 乘以 PI /180
 | 
	
		
			
				|  |  | +Private Function lineangle(x1, y1, x2, y2) As Double
 | 
	
		
			
				|  |  | +  pi = 4 * VBA.Atn(1) ' 计算圆周率
 | 
	
		
			
				|  |  | +  If x2 = x1 Then
 | 
	
		
			
				|  |  | +    lineangle = 90: Exit Function
 | 
	
		
			
				|  |  | +  End If
 | 
	
		
			
				|  |  | +  lineangle = VBA.Atn((y2 - y1) / (x2 - x1)) / pi * 180
 | 
	
		
			
				|  |  | +End Function
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Public Function 角度转平()
 | 
	
		
			
				|  |  | +  On Error GoTo ErrorHandler
 | 
	
		
			
				|  |  | +'  ActiveDocument.ReferencePoint = cdrCenter
 | 
	
		
			
				|  |  | +  Set sr = ActiveSelectionRange
 | 
	
		
			
				|  |  | +  Set nr = sr.LastShape.DisplayCurve.Nodes.All
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  If nr.Count = 2 Then
 | 
	
		
			
				|  |  | +    x1 = nr.FirstNode.PositionX: y1 = nr.FirstNode.PositionY
 | 
	
		
			
				|  |  | +    x2 = nr.LastNode.PositionX: y2 = nr.LastNode.PositionY
 | 
	
		
			
				|  |  | +    a = lineangle(x1, y1, x2, y2): sr.Rotate -a
 | 
	
		
			
				|  |  | +    ' sr.LastShape.Delete   '// 删除参考线
 | 
	
		
			
				|  |  | +  End If
 | 
	
		
			
				|  |  | +ErrorHandler:
 | 
	
		
			
				|  |  | +End Function
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Public Function 自动旋转角度()
 | 
	
		
			
				|  |  | +  On Error GoTo ErrorHandler
 | 
	
		
			
				|  |  | +'  ActiveDocument.ReferencePoint = cdrCenter
 | 
	
		
			
				|  |  | +  Set sr = ActiveSelectionRange
 | 
	
		
			
				|  |  | +  Set nr = sr.LastShape.DisplayCurve.Nodes.All
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  If nr.Count = 2 Then
 | 
	
		
			
				|  |  | +    x1 = nr.FirstNode.PositionX: y1 = nr.FirstNode.PositionY
 | 
	
		
			
				|  |  | +    x2 = nr.LastNode.PositionX: y2 = nr.LastNode.PositionY
 | 
	
		
			
				|  |  | +    a = lineangle(x1, y1, x2, y2): sr.Rotate 90 + a
 | 
	
		
			
				|  |  | +    sr.LastShape.Delete   '// 删除参考线
 | 
	
		
			
				|  |  | +  End If
 | 
	
		
			
				|  |  | +ErrorHandler:
 | 
	
		
			
				|  |  | +End Function
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +Public Function 交换对象()
 | 
	
		
			
				|  |  | +  Set sr = ActiveSelectionRange
 | 
	
		
			
				|  |  | +  If sr.Count = 2 Then
 | 
	
		
			
				|  |  | +    X = sr.LastShape.CenterX: Y = sr.LastShape.CenterY
 | 
	
		
			
				|  |  | +    sr.LastShape.CenterX = sr.FirstShape.CenterX: sr.LastShape.CenterY = sr.FirstShape.CenterY
 | 
	
		
			
				|  |  | +    sr.FirstShape.CenterX = X: sr.FirstShape.CenterY = Y
 | 
	
		
			
				|  |  | +  End If
 | 
	
		
			
				|  |  | +End Function
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +'//  ===================================================
 | 
	
		
			
				|  |  | +Private Sub btn_autoalign_byrow_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
 | 
	
		
			
				|  |  | +    If get_events("btn_autoalign_byrow", Shift, Button) = "exit" Then Exit Sub
 | 
	
		
			
				|  |  | +    autogroup("group_lines", 16 + Shift).CreateSelection
 | 
	
		
			
				|  |  | +End Sub
 | 
	
		
			
				|  |  | +Private Sub btn_autoalign_bycolumn_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
 | 
	
		
			
				|  |  | +    If get_events("btn_autoalign_bycolumn", Shift, Button) = "exit" Then Exit Sub
 | 
	
		
			
				|  |  | +    autogroup("group_lines", 13 + Shift).CreateSelection
 | 
	
		
			
				|  |  | +End Sub
 | 
	
		
			
				|  |  | +Private Sub btn_autogroup_byrow_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
 | 
	
		
			
				|  |  | +    If get_events("btn_autogroup_byrow", Shift, Button) = "exit" Then Exit Sub
 | 
	
		
			
				|  |  | +    autogroup("group_lines", 6).CreateSelection
 | 
	
		
			
				|  |  | +End Sub
 | 
	
		
			
				|  |  | +Private Sub btn_autogroup_bycolumn_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
 | 
	
		
			
				|  |  | +    If get_events("btn_autogroup_bycolumn", Shift, Button) = "exit" Then Exit Sub
 | 
	
		
			
				|  |  | +    autogroup("group_lines", 3).CreateSelection
 | 
	
		
			
				|  |  | +End Sub
 | 
	
		
			
				|  |  | +Private Sub btn_autogroup_bysquare_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
 | 
	
		
			
				|  |  | +    If get_events("btn_autogroup_bysquare", Shift, Button) = "exit" Then Exit Sub
 | 
	
		
			
				|  |  | +    autogroup("group").CreateSelection
 | 
	
		
			
				|  |  | +End Sub
 | 
	
		
			
				|  |  | +Private Sub btn_autogroup_byshape_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
 | 
	
		
			
				|  |  | +    If get_events("btn_autogroup_byshape", Shift, Button) = "exit" Then Exit Sub
 | 
	
		
			
				|  |  | +    autogroup("group", 1).CreateSelection
 | 
	
		
			
				|  |  | +End Sub
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Public Sub begin_func(Optional undoname = "nul", Optional units = cdrMillimeter, Optional undogroup = True, Optional optimize = True, Optional sett = "before")
 | 
	
		
			
				|  |  | +        ActiveDocument.SaveSettings sett
 | 
	
		
			
				|  |  | +        ActiveDocument.Unit = units
 | 
	
		
			
				|  |  | +        If undogroup Then ActiveDocument.BeginCommandGroup undoname
 | 
	
		
			
				|  |  | +        Application.Optimization = optimize
 | 
	
		
			
				|  |  | +        EventsEnabled = Not optimize
 | 
	
		
			
				|  |  | +End Sub
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Public Sub end_func(Optional undogroup = True, Optional sett = "before")
 | 
	
		
			
				|  |  | +    cure_app undogroup
 | 
	
		
			
				|  |  | +    ActiveDocument.RestoreSettings sett
 | 
	
		
			
				|  |  | +End Sub
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Sub cure_app(Optional undogroup = True)
 | 
	
		
			
				|  |  | +    EventsEnabled = True
 | 
	
		
			
				|  |  | +    Application.Optimization = False
 | 
	
		
			
				|  |  | +    Application.Refresh
 | 
	
		
			
				|  |  | +    DoEvents
 | 
	
		
			
				|  |  | +    If undogroup Then ActiveDocument.EndCommandGroup
 | 
	
		
			
				|  |  | +End Sub
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Public Function collect_arr(arr, ci, ki)
 | 
	
		
			
				|  |  | +    lim = UBound(arr)
 | 
	
		
			
				|  |  | +    For k = 1 To lim
 | 
	
		
			
				|  |  | +        If arr(ki, k) > 0 Then
 | 
	
		
			
				|  |  | +            arr(ci, k) = k
 | 
	
		
			
				|  |  | +            If ki <> ci Then arr(ki, k) = Empty
 | 
	
		
			
				|  |  | +            If ci <> k And ki <> k Then arr = collect_arr(arr, ci, k)
 | 
	
		
			
				|  |  | +        End If
 | 
	
		
			
				|  |  | +    Next k
 | 
	
		
			
				|  |  | +    'If ki <> ci Then arr(ki, ki) = Empty
 | 
	
		
			
				|  |  | +    collect_arr = arr
 | 
	
		
			
				|  |  | +End Function
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Public Function autogroup(Optional group As String = "group", Optional shft = 0, Optional sss As Shapes = Nothing, Optional undogroup = True) As ShapeRange
 | 
	
		
			
				|  |  | +    Dim sr As ShapeRange, sr_all As ShapeRange, os As ShapeRange
 | 
	
		
			
				|  |  | +    Dim sp As SubPaths
 | 
	
		
			
				|  |  | +    Dim arr()
 | 
	
		
			
				|  |  | +    Dim s As Shape
 | 
	
		
			
				|  |  | +    If sss Is Nothing Then Set os = ActiveSelectionRange Else Set os = sss.All
 | 
	
		
			
				|  |  | +'On Error GoTo errn
 | 
	
		
			
				|  |  | +    If ActiveSelection.Shapes.Count > 0 Then
 | 
	
		
			
				|  |  | +        begin_func "autogroup" & group, cdrMillimeter, undogroup
 | 
	
		
			
				|  |  | +        gcnt = os.Shapes.Count
 | 
	
		
			
				|  |  | +        ReDim arr(1 To gcnt, 1 To gcnt)
 | 
	
		
			
				|  |  | +        Set sr_all = ActiveSelectionRange
 | 
	
		
			
				|  |  | +        sr_all.RemoveAll
 | 
	
		
			
				|  |  | +        If group = "group_lines" Then
 | 
	
		
			
				|  |  | +            For i = 1 To gcnt
 | 
	
		
			
				|  |  | +                If shft = 3 Or shft = 13 Or shft = 14 Then
 | 
	
		
			
				|  |  | +                    coord = Int(os.Shapes(i).CenterX)
 | 
	
		
			
				|  |  | +                Else
 | 
	
		
			
				|  |  | +                    coord = Int(os.Shapes(i).CenterY)
 | 
	
		
			
				|  |  | +                End If
 | 
	
		
			
				|  |  | +                fnd = False
 | 
	
		
			
				|  |  | +                For k = 1 To gcnt
 | 
	
		
			
				|  |  | +                    If arr(k, 1) > 0 Then
 | 
	
		
			
				|  |  | +                        If arr(k, 2) = coord Then
 | 
	
		
			
				|  |  | +                            arr(k, 1) = arr(k, 1) + 1
 | 
	
		
			
				|  |  | +                            arr(k, 2 + arr(k, 1)) = i
 | 
	
		
			
				|  |  | +                            fnd = True
 | 
	
		
			
				|  |  | +                            Exit For
 | 
	
		
			
				|  |  | +                        End If
 | 
	
		
			
				|  |  | +                    Else
 | 
	
		
			
				|  |  | +                        Exit For
 | 
	
		
			
				|  |  | +                    End If
 | 
	
		
			
				|  |  | +                Next k
 | 
	
		
			
				|  |  | +                If Not fnd Then
 | 
	
		
			
				|  |  | +                    arr(k, 1) = 1
 | 
	
		
			
				|  |  | +                    arr(k, 2) = coord
 | 
	
		
			
				|  |  | +                    arr(k, 3) = i
 | 
	
		
			
				|  |  | +                End If
 | 
	
		
			
				|  |  | +            Next i
 | 
	
		
			
				|  |  | +            Set sr = ActiveSelectionRange
 | 
	
		
			
				|  |  | +            For i = 1 To gcnt
 | 
	
		
			
				|  |  | +                If arr(i, 1) > 0 Then
 | 
	
		
			
				|  |  | +                    sr.RemoveAll
 | 
	
		
			
				|  |  | +                    For k = 3 To gcnt
 | 
	
		
			
				|  |  | +                        If arr(i, k) > 0 Then sr.Add os.Shapes(arr(i, k))
 | 
	
		
			
				|  |  | +                    Next k
 | 
	
		
			
				|  |  | +                    If sr.Shapes.Count > 0 Then
 | 
	
		
			
				|  |  | +                        sr.CreateSelection
 | 
	
		
			
				|  |  | +                        If shft = 13 Then
 | 
	
		
			
				|  |  | +                            sr.AlignAndDistribute cdrAlignDistributeHNone, cdrAlignDistributeVDistributeSpacing
 | 
	
		
			
				|  |  | +                        ElseIf shft = 14 Then
 | 
	
		
			
				|  |  | +                            sr.AlignAndDistribute cdrAlignDistributeHNone, cdrAlignDistributeVDistributeCenter
 | 
	
		
			
				|  |  | +                        ElseIf shft = 16 Then
 | 
	
		
			
				|  |  | +                            sr.AlignAndDistribute cdrAlignDistributeHDistributeSpacing, cdrAlignDistributeVNone
 | 
	
		
			
				|  |  | +                        ElseIf shft = 17 Then
 | 
	
		
			
				|  |  | +                            sr.AlignAndDistribute cdrAlignDistributeHDistributeCenter, cdrAlignDistributeVNone
 | 
	
		
			
				|  |  | +                        Else
 | 
	
		
			
				|  |  | +                            sr.group
 | 
	
		
			
				|  |  | +                        End If
 | 
	
		
			
				|  |  | +                        sr_all.AddRange sr
 | 
	
		
			
				|  |  | +                    End If
 | 
	
		
			
				|  |  | +                End If
 | 
	
		
			
				|  |  | +            Next i
 | 
	
		
			
				|  |  | +        Else
 | 
	
		
			
				|  |  | +            ReDim arr(1 To gcnt, 1 To gcnt)
 | 
	
		
			
				|  |  | +            ActiveDocument.Unit = cdrTenthMicron
 | 
	
		
			
				|  |  | +            sgap = 10
 | 
	
		
			
				|  |  | +            If shft = 2 Or shft = 3 Or shft = 6 Or shft = 7 Then
 | 
	
		
			
				|  |  | +                os.RemoveAll
 | 
	
		
			
				|  |  | +                For Each s In ActiveSelectionRange.Shapes
 | 
	
		
			
				|  |  | +                    os.Add ActivePage.SelectShapesFromRectangle(s.LeftX - sgap, s.BottomY - sgap, s.RightX + sgap, s.TopY + sgap, True)
 | 
	
		
			
				|  |  | +                Next s
 | 
	
		
			
				|  |  | +            End If
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            For i = 1 To os.Shapes.Count
 | 
	
		
			
				|  |  | +                Set s1 = os.Shapes(i)
 | 
	
		
			
				|  |  | +                arr(i, i) = i
 | 
	
		
			
				|  |  | +                For j = 1 To os.Shapes.Count
 | 
	
		
			
				|  |  | +                    Set s2 = os.Shapes(j)
 | 
	
		
			
				|  |  | +                    If s2.LeftX < s1.RightX + sgap And s2.RightX > s1.LeftX - sgap And s2.BottomY < s1.TopY + sgap And s2.TopY > s1.BottomY - sgap Then
 | 
	
		
			
				|  |  | +                        If shft = 1 Or shft = 3 Or shft = 5 Or shft = 7 Then
 | 
	
		
			
				|  |  | +                            Set isec = s1.Intersect(s2)
 | 
	
		
			
				|  |  | +                            If Not isec Is Nothing Then
 | 
	
		
			
				|  |  | +                                arr(i, j) = j
 | 
	
		
			
				|  |  | +                                isec.CreateSelection
 | 
	
		
			
				|  |  | +                                isec.Delete
 | 
	
		
			
				|  |  | +                            End If
 | 
	
		
			
				|  |  | +                        Else
 | 
	
		
			
				|  |  | +                            arr(i, j) = j
 | 
	
		
			
				|  |  | +                        End If
 | 
	
		
			
				|  |  | +                    End If
 | 
	
		
			
				|  |  | +                Next j
 | 
	
		
			
				|  |  | +            Next i
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            For i = 1 To gcnt
 | 
	
		
			
				|  |  | +                arr = collect_arr(arr, i, i)
 | 
	
		
			
				|  |  | +            Next i
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            Set sr = ActiveSelectionRange
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            For i = 1 To gcnt
 | 
	
		
			
				|  |  | +                sr.RemoveAll
 | 
	
		
			
				|  |  | +                inar = 0
 | 
	
		
			
				|  |  | +                For j = 1 To gcnt
 | 
	
		
			
				|  |  | +                    If arr(i, j) > 0 Then
 | 
	
		
			
				|  |  | +                        sr.Add os.Shapes(j)
 | 
	
		
			
				|  |  | +                        inar = inar + 1
 | 
	
		
			
				|  |  | +                    End If
 | 
	
		
			
				|  |  | +                Next j
 | 
	
		
			
				|  |  | +                If inar > 1 Then
 | 
	
		
			
				|  |  | +                    If group = "group" Then
 | 
	
		
			
				|  |  | +                        If shft < 4 Then sr_all.Add sr.group
 | 
	
		
			
				|  |  | +                    Else
 | 
	
		
			
				|  |  | +                        If group = "front" Then
 | 
	
		
			
				|  |  | +                            sr.Sort "@shape1.com.zOrder > @shape2.com.zOrder"
 | 
	
		
			
				|  |  | +                        ElseIf group = "back" Then
 | 
	
		
			
				|  |  | +                            sr.Sort "@shape1.com.zOrder < @shape2.com.zOrder"
 | 
	
		
			
				|  |  | +                        Else
 | 
	
		
			
				|  |  | +                            sr.Sort "@shape1.width*@shape1.height < @shape2.width*@shape2.height"
 | 
	
		
			
				|  |  | +                        End If
 | 
	
		
			
				|  |  | +                        Set fs = sr.FirstShape
 | 
	
		
			
				|  |  | +                        Set ls = sr.LastShape
 | 
	
		
			
				|  |  | +                        For Each s In sr.Shapes
 | 
	
		
			
				|  |  | +                            If Not s Is ls And Not s Is fs Then
 | 
	
		
			
				|  |  | +                                If group = "autocut" Then
 | 
	
		
			
				|  |  | +                                    Set isec = ls.Intersect(s)
 | 
	
		
			
				|  |  | +                                    If Not isec Is Nothing Then
 | 
	
		
			
				|  |  | +                                        If isec.Curve.Area = s.Curve.Area Then
 | 
	
		
			
				|  |  | +                                            Set ls = fs.Trim(ls, False)
 | 
	
		
			
				|  |  | +                                        Else
 | 
	
		
			
				|  |  | +                                            Set ls = fs.Weld(ls, False)
 | 
	
		
			
				|  |  | +                                        End If
 | 
	
		
			
				|  |  | +                                        isec.Delete
 | 
	
		
			
				|  |  | +                                    End If
 | 
	
		
			
				|  |  | +                                Else
 | 
	
		
			
				|  |  | +                                    Set fs = s.Weld(fs, False, False)
 | 
	
		
			
				|  |  | +                                End If
 | 
	
		
			
				|  |  | +                            End If
 | 
	
		
			
				|  |  | +                        Next s
 | 
	
		
			
				|  |  | +                        If group = "weld" Then
 | 
	
		
			
				|  |  | +                            Set ls = fs.Weld(ls, False)
 | 
	
		
			
				|  |  | +                        Else
 | 
	
		
			
				|  |  | +                            Set ls = fs.Trim(ls, False)
 | 
	
		
			
				|  |  | +                        End If
 | 
	
		
			
				|  |  | +                        sr_all.Add ls
 | 
	
		
			
				|  |  | +                    End If
 | 
	
		
			
				|  |  | +                Else
 | 
	
		
			
				|  |  | +                    If sr.Shapes.Count > 0 Then sr_all.AddRange sr
 | 
	
		
			
				|  |  | +                End If
 | 
	
		
			
				|  |  | +            Next i
 | 
	
		
			
				|  |  | +        End If
 | 
	
		
			
				|  |  | +        Set autogroup = sr_all
 | 
	
		
			
				|  |  | +    End If
 | 
	
		
			
				|  |  | +errn:
 | 
	
		
			
				|  |  | +    end_func undogroup
 | 
	
		
			
				|  |  | +End Function
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Sub auto_cut()
 | 
	
		
			
				|  |  | +    autogroup("autocut").CreateSelection
 | 
	
		
			
				|  |  | +End Sub
 | 
	
		
			
				|  |  | +Sub auto_big_small()
 | 
	
		
			
				|  |  | +    autogroup("big").CreateSelection
 | 
	
		
			
				|  |  | +End Sub
 | 
	
		
			
				|  |  | +Sub auto_group()
 | 
	
		
			
				|  |  | +    autogroup.CreateSelection
 | 
	
		
			
				|  |  | +End Sub
 | 
	
		
			
				|  |  | +Sub auto_weld()
 | 
	
		
			
				|  |  | +    autogroup("weld").CreateSelection
 | 
	
		
			
				|  |  | +End Sub
 | 
	
		
			
				|  |  | +Sub auto_group_lines()
 | 
	
		
			
				|  |  | +    autogroup("group_lines", 6).CreateSelection
 | 
	
		
			
				|  |  | +End Sub
 | 
	
		
			
				|  |  | +Sub auto_group_columns()
 | 
	
		
			
				|  |  | +    autogroup("group_lines", 3).CreateSelection
 | 
	
		
			
				|  |  | +End Sub
 |