123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- Attribute VB_Name = "Container"
- ' ① 标记容器盒子
- Public Function SetBoxName()
- Dim box As ShapeRange, s As Shape
- Set box = ActiveSelectionRange
-
- Application.Optimization = True
- ' 设置物件名字,以供CQL查询
- For Each s In box
- s.Name = "Container"
- Next s
-
- Application.Optimization = False
- ActiveWindow.Refresh: Application.Refresh
- MsgBox "标记容器盒子" & vbNewLine & "名字: Container"
-
- End Function
- ' ② 删除容器盒子边界外面的物件 ③④
- Public Function Remove_OutsideBox()
- Dim s As Shape
- Dim ssr As ShapeRange, box As ShapeRange
- Dim rmsr As New ShapeRange
- Dim x As Double, y As Double
-
- Set ssr = ActiveSelectionRange
- ' CQL查找容器盒物件
- Set box = ssr.Shapes.FindShapes(Query:="@name ='Container'")
- ssr.RemoveRange box
-
- If box.Count = 0 Then Exit Function
-
- ActiveDocument.Unit = cdrMillimeter
- For Each s In ssr
- x = s.CenterX: y = s.CenterY
- If box(1).IsOnShape(x, y) = cdrOutsideShape Then rmsr.Add s
- Next s
- rmsr.Delete
- End Function
- Public Function Remove_OnMargin()
- Dim s As Shape
- Dim ssr As ShapeRange, box As ShapeRange
- Dim rmsr As New ShapeRange
- Dim x As Double, y As Double
-
- Set ssr = ActiveSelectionRange
- ' CQL查找容器盒物件
- Set box = ssr.Shapes.FindShapes(Query:="@name ='Container'")
- ssr.RemoveRange box
-
- If box.Count = 0 Then Exit Function
-
- ActiveDocument.Unit = cdrMillimeter
- For Each s In ssr
- x = s.CenterX: y = s.CenterY
- If box(1).IsOnShape(x, y) = cdrOnMarginOfShape Then rmsr.Add s
- Next s
- rmsr.Delete
- End Function
- Public Function Select_OutsideBox()
- Dim s As Shape
- Dim ssr As ShapeRange, box As ShapeRange
- Dim SelSr As New ShapeRange
- Dim x As Double, y As Double, radius
-
- Set ssr = ActiveSelectionRange
- ' CQL查找容器盒物件
- Set box = ssr.Shapes.FindShapes(Query:="@name ='Container'")
- ssr.RemoveRange box
-
- If box.Count = 0 Then Exit Function
-
- ActiveDocument.Unit = cdrMillimeter
- For Each s In ssr
- x = s.CenterX: y = s.CenterY
- radius = s.SizeWidth / 2
- If box(1).IsOnShape(x, y, radius) = cdrOutsideShape Then SelSr.Add s
- Next s
-
- ActiveDocument.ClearSelection
- SelSr.AddToSelection
- End Function
- Public Function Select_OnMargin()
- Dim s As Shape
- Dim ssr As ShapeRange, box As ShapeRange
- Dim SelSr As New ShapeRange
- Dim x As Double, y As Double, radius
-
- Set ssr = ActiveSelectionRange
- ' CQL查找容器盒物件
- Set box = ssr.Shapes.FindShapes(Query:="@name ='Container'")
- ssr.RemoveRange box
-
- If box.Count = 0 Then Exit Function
-
- ActiveDocument.Unit = cdrMillimeter
- For Each s In ssr
- x = s.CenterX: y = s.CenterY
- radius = s.SizeWidth / 2
- If box(1).IsOnShape(x, y, radius) = cdrOnMarginOfShape Then SelSr.Add s
- Next s
-
- ActiveDocument.ClearSelection
- SelSr.AddToSelection
- End Function
- ' 图片批量置入容器
- Public Sub Batch_ToPowerClip()
- ActiveDocument.BeginCommandGroup ' 一键撤销返回
- Dim s As Shape, ssr As ShapeRange, box As ShapeRange
-
- ' 标记容器,请酌情取消注释
- ' Set box = ActiveSelectionRange
- ' For Each s In box
- ' If s.Type <> cdrBitmapShape Then s.Name = "Container"
- ' Next s
-
- Set ssr = Smart_Group(0.5) ' 智能群组容差 0.5mm
-
- Application.Optimization = True
- For Each s In ssr
- Image_ToPowerClip s
- Next s
- ActiveDocument.EndCommandGroup
- Application.Optimization = False
- ActiveWindow.Refresh: Application.Refresh
- End Sub
- ' 图片置入容器,基本函数
- Public Function Image_ToPowerClip(arg As Shape)
- Dim box As ShapeRange
- Dim ssr As New ShapeRange, rmsr As New ShapeRange
- Set ssr = arg.UngroupEx
- ' CQL查找容器盒物件
- Set box = ssr.Shapes.FindShapes(Query:="@name ='Container'")
- ssr.RemoveRange box
-
- If box.Count = 0 Then Exit Function
-
- ssr.AddToPowerClip box(1), 0
- End Function
- Private Function Smart_Group(Optional ByVal tr As Double = 0) As ShapeRange
- If 0 = ActiveSelectionRange.Count Then Exit Function
- On Error GoTo ErrorHandler
- Application.Optimization = True
- ActiveDocument.ReferencePoint = cdrBottomLeft
- ActiveDocument.Unit = cdrMillimeter
-
- Dim OrigSelection As ShapeRange, sr As New ShapeRange
- Dim s1 As Shape, sh As Shape, s As Shape
- Dim x As Double, y As Double, w As Double, h As Double
- Dim eff1 As Effect
-
- Set OrigSelection = ActiveSelectionRange
- '// 遍历物件画矩形
- For Each sh In OrigSelection
- sh.GetBoundingBox x, y, w, h
- If w * h > 4 Then
- Set s = ActiveLayer.CreateRectangle2(x - tr, y - tr, w + 2 * tr, h + 2 * tr)
- sr.Add s
- '// 轴线 创建轮廓处理
- ElseIf w * h < 0.3 Then
- ' Debug.Print w * h
- Set eff1 = sh.CreateContour(cdrContourOutside, 0.5, 1, cdrDirectFountainFillBlend, CreateRGBColor(26, 22, 35), CreateRGBColor(26, 22, 35), CreateRGBColor(26, 22, 35), 0, 0, cdrContourSquareCap, cdrContourCornerMiteredOffsetBevel, 15#)
- eff1.Separate
- End If
- Next sh
- '// 查找轴线轮廓
- ActivePage.Shapes.FindShapes(Query:="@Outline.Color=RGB(26, 22, 35)").CreateSelection
- ActivePage.Shapes.FindShapes(Query:="@fill.Color=RGB(26, 22, 35)").AddToSelection
- For Each sh In ActiveSelection.Shapes
- sr.Add sh
- Next sh
-
- '// 新矩形寻找边界,散开,删除刚才画的新矩形
- Set s1 = sr.CustomCommand("Boundary", "CreateBoundary")
- Set brk1 = s1.BreakApartEx
- sr.Delete
- '// 矩形边界智能群组, retsr 返回群组 和 删除矩形s
- Dim retsr As New ShapeRange, rmsr As New ShapeRange
- For Each s In brk1
- Set sh = ActivePage.SelectShapesFromRectangle(s.LeftX, s.TopY, s.RightX, s.BottomY, False)
- s.Delete
- retsr.Add sh.Shapes.All.group
- Next
- Set Smart_Group = retsr
-
- Application.Optimization = False
- ActiveWindow.Refresh: Application.Refresh
- Exit Function
- ErrorHandler:
- Application.Optimization = False
- MsgBox "请先选择一些物件来确定群组范围!"
- On Error Resume Next
- End Function
|