123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720 |
- VERSION 5.00
- Begin {C62A69F0-16DC-11CE-9E98-00AA00574A4F} frmSelectSame
- Caption = "Similar Selection Plus"
- ClientHeight = 5745
- ClientLeft = 495
- ClientTop = 5895
- ClientWidth = 3255
- OleObjectBlob = "frmSelectSame.frx":0000
- ShowModal = 0 'False
- End
- Attribute VB_Name = "frmSelectSame"
- Attribute VB_GlobalNameSpace = False
- Attribute VB_Creatable = False
- Attribute VB_PredeclaredId = True
- Attribute VB_Exposed = False
- '// This is free and unencumbered software released into the public domain.
- '// For more information, please refer to https://github.com/hongwenjun
- '// Attribute VB_Name = "相似选择-魔改版 蘭雅" frmSelectSame 2023.6.12
- Option Explicit
- '需要显式声明所有变量。 这可以防止无意中使用缓慢的“Variant”类型变量,这些变量在特定类型未知时使用。
- 'Requires explicit declaration of all variables. This protects against inadvertent use of the slow 'Variant' type variables which are used when the specific type is unknown.
- Public ssreg As ShapeRange
- Private Const TOOLNAME As String = "VBA_SelectSame"
- Private Const SECTION As String = "Options"
- Private Sub UserForm_Initialize()
- LNG_CODE = Val(GetSetting("LYVBA", "Settings", "I18N_LNG", "1033"))
- Init_Translations Me, LNG_CODE
- Me.Caption = i18n("Similar Selection Plus", LNG_CODE)
- End Sub
- Private Sub btnSelect_Click()
- If 0 = ActiveSelectionRange.Count Then Exit Sub
- On Error GoTo ErrorHandler
-
- Dim fLeft As Double, fTop As Double
- fLeft = frmSelectSame.Left
- fTop = frmSelectSame.Top
- SaveSetting "SelectSame", "Preferences", "form_left", fLeft
- SaveSetting "SelectSame", "Preferences", "form_top", fTop
-
- '// 区域范围选择,需要关闭刷新优化
- If OptBt.value = False Then
- API.BeginOpt
- Else
- add_ssreg
- End If
-
- If (chkFill = False And chkOutline = False And chkOutlineColor = False And _
- chkOutlineLength = False And chkSize = False And chkWHratio = False And _
- chkType = False And chkNodes = False And chkSegments = False And _
- chkPaths = False And chkFontName = False And chkFontSize = False And chkShapeName = False) Then
- MsgBox "请至少选择一个选项", vbCritical, "Select Same"
- GoTo ErrorHandler
- End If
- '// "ME"是一个VBA保留字,返回对当前代码所在窗体(或类模块)的引用。 chk... 函数返回同名复选按钮的当前值。
- '// "ME" is a VBA reserved word, returning a reference to the form (or class module) in which the current code is located.
- '// The chk... functions return the current Value of the check buttons of the same name.
- With Me
- .SelectAllSimilar .chkFill, .chkOutline, .chkOutlineColor, .chkOutlineLength, _
- .chkSize, .chkWHratio, .chkType, .chkNodes, .chkSegments, .chkPaths, _
- .OptDoc, .Optpage, .Optlayer, .chkInGroups, .chkColorMark, .chkIndiv, _
- .chkFontName, .chkFontSize, .chkShapeName
- End With
-
- API.EndOpt
-
- Exit Sub
- ErrorHandler:
- Application.Optimization = False
- End Sub
- Sub SelectAllSimilar(Optional CheckFill As Boolean = True, _
- Optional CheckOutline As Boolean = True, _
- Optional CheckOutlineColor As Boolean = True, _
- Optional CheckOutlineLength As Boolean = True, _
- Optional CheckSize As Boolean = False, _
- Optional CheckWHratio As Boolean = False, _
- Optional CheckType As Boolean = True, _
- Optional CountNodes As Boolean = False, _
- Optional CountSegments As Boolean = False, _
- Optional CountPaths As Boolean = False, _
- Optional WithinDoc As Boolean = False, _
- Optional WithinPage As Boolean = True, _
- Optional WithinLayer As Boolean = False, _
- Optional WithinGroups As Boolean = True, _
- Optional CheckColorMark As Boolean = False, _
- Optional CheckIndiv As Boolean = True, _
- Optional CheckFontName As Boolean = False, _
- Optional CheckFontSize As Boolean = False, _
- Optional CheckShapeName As Boolean = False)
-
- 'Object variables. Reference to:
- Dim shpsSelected As Shapes 'selected shapes,
- Dim shpsToTest As Shapes 'full set of shapes to be tested, ' 待测形状全部集合
- Dim pagesr As ShapeRange 'pages shapes collection,
- Dim docsr As New ShapeRange
- Dim shpModel As Shape 'a pre-selected shape,
- Dim shpToMatch As Shape 'a shape to be matched,
- 'Dim oScript As Object 'CorelScript object,
- Dim clnModelShapes As Collection 'our list of pre-selected shapes, '定义源对象集合
- Dim clnSubShapes As Collection 'our list of shapes inside a group. '定义群组内的目标对象
- Dim P As Page, p1 As Page '文档中查找使用
- Dim shr As ShapeRange, sr As New ShapeRange
- Dim i As Integer ' '文档中循环查找计数使用
- Dim fsn As Shape '// 扩展功能: 字体字号标记名检测源对象
- On Error GoTo NothingSelected 'Get a reference to any
- Set shr = ActiveSelectionRange
- Set shpsSelected = ActiveDocument.Selection.Shapes
- ' On Error GoTo 0 'pre-selected shapes. 将文档中当前选中的范围作为源对象
-
- If shpsSelected.Count > 0 Then 'Gather the pre-selected shapes
- Set clnModelShapes = New Collection 'into a new collection for
- For Each shpModel In shpsSelected 'simple processing. 建立源对象集合
- clnModelShapes.Add shpModel
- Next
-
- '// 魔改分支 字体-字号-标记名
- If CheckFontName Or CheckFontSize Or CheckShapeName Then
- Set fsn = shr(1)
- End If
- '===================================
- ' TurnOptimizations cdrOptimizationOn
- '===================================
-
- If WithinPage Then
- If OptBt.value = True Then
- Set shpsToTest = ssreg.Shapes
- OptBt.value = 0
- API.BeginOpt
- Else
- Set shpsToTest = ActivePage.Shapes
- End If
- 'Ensure that "Edit across layers"
- 'is ON. Otherwise, selecting
- ' Set oScript = CorelScript 'across layers, followed by
- ' oScript.SetMultiLayer True 'grouping, can flatten all
- ' Set oScript = Nothing 'layers into one. 选中表示将对当前页面的所有对象与源对象进行匹配,否则只匹配当前图层的对象
-
- 'Replace the above with this line, CoreScript is not longer support X7+
- ActiveDocument.EditAcrossLayers = True
- End If
- If WithinLayer Then
- Set shpsToTest = ActivePage.ActiveLayer.Shapes
- End If
-
- If WithinDoc Then '在当前文档查找,将当前页面相应的对象加入到待比较范围
- For i = 1 To ActiveDocument.Pages.Count
- ActiveDocument.Pages(i).Activate
- Set p1 = ActiveDocument.Pages(i)
- Set pagesr = ActivePage.SelectShapesFromRectangle(0, p1.CenterY * 2, p1.CenterX * 2, 0, False).Shapes.all
- Debug.Print p1.CenterY * 2 & p1.CenterX * 2
- docsr.AddRange pagesr '各页面依次查找,相应的对象加入到待比较范围
-
- Next i
- Set shpsToTest = docsr.Shapes
- ' MsgBox "共有待比较对象 " & shpsToTest.Count & " 个"
- Label13.Caption = "共有待比较对象 " & shpsToTest.Count & " 个"
- 'p1.Activate
- End If
-
- If WithinGroups Then 'Check through flattened list.
- Set clnSubShapes = FlatShapeList(shpsToTest)
- '=======
- For Each shpToMatch In clnSubShapes
- If Not shpToMatch.Selected Then 'If the shape is not yet selected,
-
- '==================== 'check the models for a match.
- For Each shpModel In clnModelShapes
- If ShapesMatch(shpToMatch, shpModel, CheckFill, _
- CheckOutline, CheckOutlineColor, CheckOutlineLength, CheckSize, CheckWHratio, _
- CheckType, CountNodes, CountSegments, CountPaths, CheckIndiv) Then
- 'shpToMatch.AddToSelection
- sr.Add shpToMatch
- Exit For 'If a match has now been found,
- End If 'we can skip any remaining models.
- Next
- '=====================
-
- End If
- Next
- '=======
- Else 'Check through top-level list.
- For Each shpToMatch In shpsToTest
- If Not shpToMatch.Selected Then 'If the shape is not yet selected,
- 'check the models for a match.
- For Each shpModel In clnModelShapes
- If ShapesMatch(shpToMatch, shpModel, CheckFill, _
- CheckOutline, CheckOutlineColor, CheckOutlineLength, CheckSize, CheckWHratio, _
- CheckType, CountNodes, CountSegments, CountPaths, CheckIndiv) Then
- 'shpToMatch.AddToSelection
- sr.Add shpToMatch
- Exit For 'If a match has now been found,
- End If 'we can skip any remaining models.
- Next
-
- End If
- Next
- End If
-
- '===================================
- ' TurnOptimizations cdrOptimizationOff
- 'CorelScript.RedrawScreen
- '===================================
- 'sr.Add ActiveDocument.Selection
- If CheckColorMark And sr.Count > 0 Then sr.SetOutlineProperties , , CreateCMYKColor(0, 100, 0, 0) '轮廓线上色
- sr.AddRange shr
-
- '// 魔改分支 字体-字号-标记名
- If CheckFontName Or CheckFontSize Or CheckShapeName Then
- If CheckFontName Then ShapesMatch_Font_Name fsn, sr, "FontName"
- If CheckFontSize Then ShapesMatch_Font_Name fsn, sr, "FontSize"
- If CheckShapeName Then ShapesMatch_Font_Name fsn, sr, "ShapeName"
- End If
-
- sr.CreateSelection
- '// 显示找到对象
- Label13.Caption = "共找到 " & sr.Count & " 个对象"
- End If
-
- Set clnModelShapes = Nothing 'Release the memory allocated
- Set shpsToTest = Nothing
- Exit Sub
- NothingSelected:
- End Sub
- '// 添加区域选择分支
- Private Function add_ssreg()
- Dim ssr As ShapeRange, shr As ShapeRange
- Dim x1 As Double, y1 As Double, x2 As Double, y2 As Double
- Dim Shift As Long
- Dim b As Boolean
- Set shr = ActiveSelectionRange
- b = ActiveDocument.GetUserArea(x1, y1, x2, y2, Shift, 10, False, cdrCursorWeldSingle)
- If Not b Then
- Set ssreg = ActivePage.SelectShapesFromRectangle(x1, y1, x2, y2, True).Shapes.all
- End If
- ActiveDocument.ClearSelection
- shr.CreateSelection
- End Function
- '// 魔改分支 字体-字号-标记名 检查匹配
- Private Function ShapesMatch_Font_Name(ByVal fsn As Shape, sr As ShapeRange, Check_Case As String)
- Dim xz As String, sh_name As String, strFontName As String
- Dim FontSize As Double
- Dim srText As ShapeRange
- Set srText = sr.Shapes.FindShapes(Type:=cdrTextShape)
-
- Select Case Check_Case
- Case "FontName"
- If fsn.Type = cdrTextShape Then
- strFontName = fsn.text.Story.Font
- Set sr = srText.Shapes.FindShapes(Query:="@type ='text:artistic' or @type ='text:paragraph' and @com.text.story.font = '" & strFontName & "'")
- End If
-
- Case "FontSize"
- If fsn.Type = cdrTextShape Then
- FontSize = fsn.text.Story.size
- Set sr = srText.Shapes.FindShapes(Query:="@type ='text:artistic' or @type ='text:paragraph' and (@com.text.story.size - " & FontSize & ").abs() < 0.1 ")
- End If
-
- Case "ShapeName"
- sh_name = fsn.name
- Set sr = sr.Shapes.FindShapes(Query:="@name ='" & sh_name & "'")
- End Select
- End Function
- Private Function ShapesMatch(shpShape As Shape, shpModel As Shape, _
- Optional CheckFill As Boolean = True, _
- Optional CheckOutline As Boolean = True, _
- Optional CheckOutlineColor As Boolean = True, _
- Optional CheckOutlineLength As Boolean = True, _
- Optional CheckSize As Boolean = False, _
- Optional CheckWHratio As Boolean = False, _
- Optional CheckType As Boolean = True, _
- Optional CountNodes As Boolean = False, _
- Optional CountSegments As Boolean = False, _
- Optional CountPaths As Boolean = False, _
- Optional CheckIndiv As Boolean = False) As Boolean
-
- 'Sizes "match" if they differ by less than one per cent
- Dim ToleranceSize As Double '面积大小允许波动
- ToleranceSize = Me.TextBox1 / 100 '面积大小允许波动,以百分比为单位
-
- Dim ToleranceLength As Double '线长允许波动
- ToleranceLength = Me.TextBox2 / 100 '长度允许波动,以百分比为单位
-
- Dim ToleranceNodesCount As Long '节点数量允许波动,以 点 单位
- ToleranceNodesCount = Me.TextBox3 '节点数量允许波动,以 点 单位
-
- Dim ToleranceSubPathsCount As Long '子路径 子线段 允许波动,以 条 为单位
- ToleranceSubPathsCount = Me.TextBox4 '子路径 子线段 允许波动,以 条 为单位
-
- Dim ToleranceWHratio As Double '长宽比 允许波动,以 百分比 为单位
- ToleranceWHratio = Me.TextBox5 '长宽比 允许波动,以 百分比 为单位
-
- Dim ToleranceSegmentsCount As Long '线段数 允许波动,以 个 为单位
- ToleranceSegmentsCount = Me.TextBox6 '线段数 允许波动,以 个 为单位
-
- 'Object Variables. 'Reference to:
- Dim clrModel As Color 'color features of model shape,
- Dim clrShape As Color 'color features of shape to be tested
- Dim fillModel As Fill 'fill style of model shape,
- Dim outlnModel As Outline 'outline style of model shape,
- Dim crvModel As Curve 'Bezier curve of model shape,
- Dim crvShape As Curve 'Bezier curve of shape to be tested,
- Dim fntModel As StructFontProperties 'font properties of model text shape,
- Dim trgModel As text 'general text properties of model shape.
- Dim spath As SubPath, opath As SubPath
- Dim j As Integer
-
- 'Simple Variables. Storage of:
- Dim dblWidth As Double 'width of a shape,
- Dim dblHeight As Double 'height of a shape,
- Dim lngShapeType As cdrShapeType 'code for type of shape to be tested,
- Dim lngModelType As cdrShapeType 'code for the type of a model shape,
- Dim lngType As Long 'code for the type of a fill, color,
- 'or outline.
-
-
- 'Does the SHAPE match the MODEL ?
- 'Exit immediately on any mismatch.
- With shpShape
- lngShapeType = .Type 'Same basic TYPE of shape ?
- lngModelType = shpModel.Type
-
- If CheckType Then If lngShapeType <> lngModelType Then GoTo NoMatch
- 'A GROUP ? delegate to GroupsMatch()
- ' If lngShapeType = cdrGroupShape Then
- ' ShapesMatch = GroupsMatch(shpShape, shpModel, CheckSize, _
- ' CountNodes, CountPaths)
- ' Exit Function
- ' End If
- 'Does SIZE count ? Is so, are the
- If CheckSize Then 'size differences significant ?
- dblWidth = shpModel.SizeWidth
- If Abs(.SizeWidth - dblWidth) > (dblWidth * _
- ToleranceSize) Then GoTo NoMatch
- dblHeight = shpModel.SizeHeight
- If Abs(.SizeHeight - dblHeight) > (dblHeight * _
- ToleranceSize) Then GoTo NoMatch
- End If
-
- If CheckWHratio Then 'size width and height ratio differences significant ?
- dblWidth = shpModel.SizeWidth
- dblHeight = shpModel.SizeHeight
- If Abs(.SizeHeight / .SizeWidth - dblHeight / dblWidth) > (dblHeight / dblWidth * ToleranceWHratio) Then GoTo NoMatch
- End If
-
- If CountNodes Or CountPaths Or CheckOutlineLength Or CountSegments Then
- 'Only Curves can match ...
- If lngShapeType <> cdrCurveShape Then GoTo NoMatch
-
- Set crvShape = .Curve
- Set crvModel = shpModel.Curve
-
- 'If CheckIndiv Then '逐条子路径比较
- 'If Abs(crvShape.SubPaths.Count - crvModel.SubPaths.Count) <> 0 Then GoTo NoMatch
- 'For j = 1 To crvShape.SubPaths.Count
- 'If Abs(crvShape.SubPath(j).Nodes.Count - crvModel.SubPath(j).Nodes.Count) > ToleranceNodesCount Then GoTo NoMatch
-
- 'Next j
-
- If CountPaths Then 'Do the PATH counts match ?
-
- If VersionMajor > 12 Then 'GDG ##########################################
- If Abs(crvShape.SubPaths.Count - crvModel.SubPaths.Count) > ToleranceSubPathsCount Then GoTo NoMatch
- 'MsgBox "subpaths1: " & crvShape.SubPaths.Count & "subpaths2: " & crvModel.SubPaths.Count
- Else
- If Abs(crvShape.SubPathCount - crvModel.SubPathCount) > ToleranceSubPathsCount Then GoTo NoMatch
- End If 'GDG #############################################################
-
- End If
-
-
-
-
- If CountNodes Then 'Do the NODE counts match ?
-
- If VersionMajor > 12 Then 'GDG ##########################################
- If Abs(crvShape.Nodes.Count - crvModel.Nodes.Count) > ToleranceNodesCount Then GoTo NoMatch
- Else
- If Abs(crvShape.NodeCount - crvModel.NodeCount) > ToleranceNodesCount Then GoTo NoMatch
- End If 'GDG #############################################################
-
- End If
-
- If CountSegments Then 'Do the Segments counts match ?
-
- If VersionMajor > 12 Then 'GDG ##########################################
- If Abs(crvShape.Segments.Count - crvModel.Segments.Count) > ToleranceSegmentsCount Then GoTo NoMatch
- Else
- If Abs(crvShape.SegmentCount - crvModel.SegmentCount) > ToleranceSegmentsCount Then GoTo NoMatch
- End If 'GDG #############################################################
-
- End If
-
-
-
- If CheckOutlineLength Then 'Do the curve length match ?
-
- If VersionMajor > 12 Then 'GDG ##########################################
- If Abs(crvShape.Length - crvModel.Length) > crvModel.Length * ToleranceLength Then GoTo NoMatch
- 'MsgBox "subpaths1: " & crvShape.SubPaths.Count & "subpaths2: " & crvModel.SubPaths.Count
- Else
- If Abs(crvShape.Length - crvModel.Length) > crvModel.Length * ToleranceLength Then GoTo NoMatch
- End If 'GDG #############################################################
-
- End If
- End If
- If CheckFill Then
- Set fillModel = shpModel.Fill
- With .Fill 'Is the FILL type the same ?
- lngType = .Type
- If lngType <> shpModel.Fill.Type Then GoTo NoMatch
- If lngType = cdrUniformFill Then
- 'Does the uniform fill match ?
- If VersionMajor > 12 Then 'GDG ##########################################
- 'GDG ##########################################
- Dim col1 As New Color
- col1.CopyAssign .UniformColor
- Dim col2 As New Color
- col2.CopyAssign shpModel.Fill.UniformColor
- 'GDG ##########################################
- If col1.IsSame(col2) = False Then GoTo NoMatch
- Else
- Set clrModel = fillModel.UniformColor
- lngType = .UniformColor.Type
- If lngType <> clrModel.Type Then GoTo NoMatch
- If .UniformColor.name(True) <> clrModel.name(True) Then GoTo NoMatch
- End If 'GDG #############################################################
- End If
- End With
- End If
-
-
-
- If CheckOutline Then '(Groups have no outline)
- If lngShapeType <> cdrGroupShape Then
- Set outlnModel = shpModel.Outline
- If Not outlnModel Is Nothing Then
- With .Outline
- lngType = .Type
- If lngType <> outlnModel.Type Then GoTo NoMatch
-
- If lngType > 0 Then 'Does the shape have an OUTLINE ?
- 'Same LINE WIDTH ?
- If .width <> outlnModel.width Then GoTo NoMatch
- 'Matching LINE COLOR ?
- ' Set clrShape = .Color
- ' lngType = clrShape.Type
- ' Set clrModel = outlnModel.Color
- ' If lngType <> clrModel.Type Then GoTo NoMatch
- ' If clrShape.Name(True) <> clrModel.Name(True) Then GoTo NoMatch
- End If
- End With
- End If
- End If
- End If
-
-
- If CheckOutlineColor Then '(Groups have no outline)
- If lngShapeType <> cdrGroupShape Then
-
-
- Set outlnModel = shpModel.Outline
- If Not outlnModel Is Nothing Then
-
- With .Outline
- lngType = .Type
- If lngType <> outlnModel.Type Then GoTo NoMatch
-
- If lngType > 0 Then 'Does the shape have an OUTLINE ?
- 'Matching LINE COLOR ?
-
- If VersionMajor > 12 Then 'GDG ##########################################
- 'GDG ##########################################
- Dim col3 As New Color
- col3.CopyAssign .Color
- Dim col4 As New Color
- col4.CopyAssign shpModel.Outline.Color
- 'GDG ##########################################
- If col3.IsSame(col4) = False Then GoTo NoMatch
- Else
- Set clrShape = .Color
- lngType = clrShape.Type
- Set clrModel = outlnModel.Color
- If lngType <> clrModel.Type Then GoTo NoMatch
- If clrShape.name(True) <> clrModel.name(True) _
- Then GoTo NoMatch
- End If
- End If
- End With
- End If
- End If
- End If
-
- End With
-
- ShapesMatch = True
- Exit Function
-
- NoMatch:
- ShapesMatch = False
-
- NoMatchExit:
- ShapesMatch = False
- Exit Function
- End Function
- Private Function GroupsMatch(Group As Shape, GroupModel As Shape, _
- Optional CheckFill As Boolean = True, _
- Optional CheckOutline As Boolean = True, _
- Optional CheckOutlineColor As Boolean = True, _
- Optional CheckOutlineLength As Boolean = True, _
- Optional CheckSize As Boolean = False, _
- Optional CheckType As Boolean = True, _
- Optional CountNodes As Boolean = False, _
- Optional CountPaths As Boolean = False) As Boolean
-
- 'Object Variables. Reference to:
- Dim shpsModels As Shapes 'shapes in the pre-selected group,
- Dim shpsInGroup As Shapes 'shapes in the group to be tested,
- Dim shpModel As Shape 'a shape in the pre-selected group,
- Dim shpInGroup As Shape 'a shape in the group to be tested.
-
- 'Simple Variables Storage of:
- Dim lngInGroup As Long 'number of shapes in a group,
- Dim i As Long 'a numeric index to a
- 'particular sub-group.
-
- 'On Error GoTo NoMatch 'Shape & model must be groups.
- Set shpsModels = GroupModel.Shapes
- Set shpsInGroup = Group.Shapes
- 'On Error GoTo 0
- 'Same number of shapes
- lngInGroup = shpsModels.Count 'in each group ?
- If shpsInGroup.Count <> lngInGroup Then GoTo NoMatch
-
- For i = 1 To lngInGroup 'Try to Match all sub-shapes,
- Set shpInGroup = shpsInGroup(i) 'and GroupsMatch all sub-groups.
- Set shpModel = shpsModels(i)
-
- If shpModel.Type <> cdrGroupShape Then
- If Not ShapesMatch(shpInGroup, shpModel, _
- CheckSize, CountNodes) Then GoTo NoMatch
- Else
- If Not GroupsMatch(shpInGroup, shpModel, _
- CheckSize, CountNodes) Then GoTo NoMatch
- End If
- Next i
-
- GroupsMatch = True
- Exit Function
- NoMatch:
- GroupsMatch = False
- End Function
- Private Function FlatShapeList(TopLevelShapes As Shapes) As Collection
-
- 'Object Variables. Reference to:
- Dim shpTopLevel As Shape 'a top-level shape,
- Dim shpInGroup As Shape 'a shape inside a group,
- Dim clnAllShapes As Collection 'our list of all members and
- 'descendants of TopLevelShapes.
-
- If TopLevelShapes.Count Then
- Set clnAllShapes = New Collection
- For Each shpTopLevel In TopLevelShapes
- 'Add shape to list, keyed under
- 'a string version of its unique ID
- clnAllShapes.Add shpTopLevel
- 'If the shape is a group, then
- 'also gather all its descendants
- 'and add them to the list.
- If shpTopLevel.Type = cdrGroupShape Then
- For Each shpInGroup In ShapesInGroup(shpTopLevel)
- clnAllShapes.Add shpInGroup
- Next
- End If
- Next
- Set FlatShapeList = clnAllShapes 'Return the assembled collection.
- Else
- Set FlatShapeList = Nothing
- End If
- End Function
- Private Function ShapesInGroup(GroupShape As Shape) As Collection
- 'Object Variables. Reference to:
- Dim shpsInGroup As Shapes 'the set of shapes inside a group,
- Dim shpInGroup As Shape 'a particular shape in a group,
- Dim shpNested As Shape 'a shape inside a sub-group,
- Dim clnShapeList As Collection 'our list of all nested shapes.
-
- If GroupShape.Type = cdrGroupShape Then
- Set shpsInGroup = GroupShape.Shapes 'Get a reference to the
- 'shapes in this group.
- Set clnShapeList = New Collection
- For Each shpInGroup In shpsInGroup
- clnShapeList.Add shpInGroup 'Add all shapes in the group to
- 'our main collection.
- If shpInGroup.Type = cdrGroupShape Then
- 'Recurse to get nested shapes.
- For Each shpNested In ShapesInGroup(shpInGroup)
- clnShapeList.Add shpNested
- Next
- End If
- Next
- Set ShapesInGroup = clnShapeList 'Return the assembled collection.
- Else
- Set ShapesInGroup = Nothing 'Release the memory if the
- End If 'collection is not needed
- End Function
- Private Sub UserForm_Activate()
- Const YES As String = "True"
- Const NO As String = "False"
- OptDoc = GetSetting(TOOLNAME, SECTION, "InDoc", NO)
- Optlayer = GetSetting(TOOLNAME, SECTION, "InLayer", NO)
- Optpage = GetSetting(TOOLNAME, SECTION, "InPage", YES)
-
- chkColorMark = GetSetting(TOOLNAME, SECTION, "ColorMark", YES)
- chkFill = GetSetting(TOOLNAME, SECTION, "Fill", YES)
- chkInGroups = GetSetting(TOOLNAME, SECTION, "InGroups", YES)
- chkNodes = GetSetting(TOOLNAME, SECTION, "Nodes", NO)
- chkSegments = GetSetting(TOOLNAME, SECTION, "Segments", NO)
- chkOutline = GetSetting(TOOLNAME, SECTION, "Outline", YES)
- chkOutlineColor = GetSetting(TOOLNAME, SECTION, "OutlineColor", NO)
- chkOutlineLength = GetSetting(TOOLNAME, SECTION, "OutlineLength", YES)
- chkPaths = GetSetting(TOOLNAME, SECTION, "Paths", NO)
- chkSize = GetSetting(TOOLNAME, SECTION, "Size", NO)
- chkWHratio = GetSetting(TOOLNAME, SECTION, "WHratio", NO)
- chkType = GetSetting(TOOLNAME, SECTION, "Type", YES)
- chkIndiv = GetSetting(TOOLNAME, SECTION, "Indiv", NO)
- chkColorMark = GetSetting(TOOLNAME, SECTION, "ColorMark", NO)
- saveFormPos False
- End Sub
- Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
- saveFormPos True
- End Sub
- Sub saveFormPos(bDoSave As Boolean)
- Dim dL, dT
- If bDoSave Then 'save position
- SaveSetting TOOLNAME, SECTION, "form_left", Me.Left
- SaveSetting TOOLNAME, SECTION, "form_top", Me.Top
- Else 'place instead.
- dL = GetSetting(TOOLNAME, SECTION, "form_left", 900)
- dT = GetSetting(TOOLNAME, SECTION, "form_top", 200)
- Me.Left = dL: Me.Top = dT
- End If
- End Sub
- Private Sub OptDoc_Click()
- SaveSetting TOOLNAME, SECTION, "InDoc", CStr(OptDoc)
- End Sub
- Private Sub Optlayer_Click()
- SaveSetting TOOLNAME, SECTION, "InLayer", CStr(Optlayer)
- End Sub
- Private Sub Optpage_Click()
- SaveSetting TOOLNAME, SECTION, "InPage", CStr(Optpage)
- End Sub
- Private Sub chkColorMark_Click()
- SaveSetting TOOLNAME, SECTION, "ColorMark", CStr(chkColorMark)
- End Sub
- Private Sub chkIndiv_Click()
- SaveSetting TOOLNAME, SECTION, "Indiv", CStr(chkIndiv)
- End Sub
- Private Sub chkFill_Click()
- SaveSetting TOOLNAME, SECTION, "Fill", CStr(chkFill)
- End Sub
- Private Sub chkInGroups_Click()
- SaveSetting TOOLNAME, SECTION, "InGroups", CStr(chkInGroups)
- End Sub
- Private Sub chkNodes_Click()
- SaveSetting TOOLNAME, SECTION, "Nodes", CStr(chkNodes)
- End Sub
- Private Sub chkSegments_Click()
- SaveSetting TOOLNAME, SECTION, "Segments", CStr(chkSegments)
- End Sub
- Private Sub chkOutline_Click()
- SaveSetting TOOLNAME, SECTION, "Outline", CStr(chkOutline)
- End Sub
- Private Sub chkOutlineColor_Click()
- SaveSetting TOOLNAME, SECTION, "OutlineColor", CStr(chkOutlineColor)
- End Sub
- Private Sub chkPaths_Click()
- SaveSetting TOOLNAME, SECTION, "Paths", CStr(chkPaths)
- End Sub
- Private Sub chkSize_Click()
- SaveSetting TOOLNAME, SECTION, "Size", CStr(chkSize)
- End Sub
- Private Sub chkWHratio_Click()
- SaveSetting TOOLNAME, SECTION, "WHratio", CStr(chkWHratio)
- End Sub
- Private Sub chkType_Click()
- SaveSetting TOOLNAME, SECTION, "Type", CStr(chkType)
- End Sub
- Private Sub chkOutLineLength_Click()
- SaveSetting TOOLNAME, SECTION, "OutlineLength", CStr(chkOutlineLength)
- End Sub
|