做了个CAD 输出表格的前置,有个选择集的问题,大神来看下。
这个程序准备用于图纸内的表格输出,本人水平有限,所以前期就是将表格中的多行文字转为单行文字,再将单行文字宽高比改小。最后,将整个表格的高度改为7,文字近似为3.5。这样处理后,再用贱人工具箱的功能,将表格输出。后期有时间再把贱人输出表格的功能加进去。现在的问题是,现在的选择集不太靠谱:①第三次运行选择集时,在本地窗口中,发现预计框选的数量和sset选择集中的cout数量不一样,差好多,而且同一张表,复制几份,每份运行的结果都不一样(当然也有时,运行的结果是正确的);②第二次运行选择集时,每次数量都不包括第一次选择集中新建的单行文字的数量。Option Explicit
Public Sub MTextTotext()
On Error Resume Next
Dim ptInsert As Variant
Dim txtStr As String
Dim height As Double
Dim width As Double, bbg As Double
Dim k As Double, oScale As Double
Dim pt1, pt2, pt3
k = 0.4
'确定选择范围区以及表格现有的标高*********************************************
pt1 = ThisDrawing.Utility.GetPoint(, "框选左上角一个点: ")
pt2 = ThisDrawing.Utility.GetPoint(, "框选右下角一个点: ")
pt3 = ThisDrawing.Utility.GetPoint(, "将表格变成7mm高,选取左上角下方邻近点,以确定现有表格高度: ")
bbg = GetDistance(pt1, pt3)
Dim SSet As AcadSelectionSet
oScale = 7 / bbg
'选择多行文字*********************************************
'安全创建选择集
If Not IsNull(ThisDrawing.SelectionSets.Item("this")) Then
Set SSet = ThisDrawing.SelectionSets.Item("this")
SSet.Delete
End If
Set SSet = ThisDrawing.SelectionSets.Add("this")
'定义过滤规则
Dim filterType(0) As Integer
Dim filterData(0) As Variant
filterType(0) = 0
filterData(0) = "MText"
SSet.Select acSelectionSetCrossing, pt1, pt2, filterType, filterData
'创建单行文字***************************************************************
Dim ptMin As Variant, ptMax As Variant
Dim objText As AcadText
Dim objMText As AcadMText
For Each objMText In SSet
'获得文字的主要参数
height = objMText.height
ptInsert = objMText.InsertionPoint
ptInsert(1) = ptInsert(1) - height
txtStr = MtextStringClearFormat(objMText.TextString)
'文字的限制框宽度
Set objText = ThisDrawing.ModelSpace.AddText(txtStr, ptInsert, height)
objText.ScaleFactor = k
objMText.Delete'删除原来的多行文字
Next
SSet.Delete
'第二步,在上一步的基础上,实现所有单行文字宽高比,变成K。
'安全创建选择集
If Not IsNull(ThisDrawing.SelectionSets.Item("this")) Then
Set SSet = ThisDrawing.SelectionSets.Item("this")
SSet.Delete
End If
Set SSet = ThisDrawing.SelectionSets.Add("this")
'定义过滤规则,选持单行文字。
filterType(0) = 0
filterData(0) = "Text"
SSet.Select acSelectionSetCrossing, pt1, pt2, filterType, filterData
For Each objText In SSet
objText.ScaleFactor = k
Next
SSet.Delete
'第三步,表格整体缩放,在现在表格标高的基础上,将单表格高度整体缩放为7mm高,此时文字大概的高度为3.5mm,标准化后以便下一步操作。
'安全创建选择集
Dim objEnt As AcadEntity
If Not IsNull(ThisDrawing.SelectionSets.Item("this")) Then
Set SSet = ThisDrawing.SelectionSets.Item("this")
SSet.Delete
End If
Set SSet = ThisDrawing.SelectionSets.Add("this")
SSet.Select acSelectionSetCrossing, pt1, pt2
For Each objEnt In SSet
objEnt.ScaleEntity pt1, oScale
Next
SSet.Delete
End Sub
Public Function MtextStringClearFormat(MTextString As String) As String '清除掉多行文字中的格式。
Dim MyString As String
MyString = MTextString
MyString = ReplaceByRegExp(MyString, "\\{", Chr(1))
MyString = ReplaceByRegExp(MyString, "\\}", Chr(2))
MyString = ReplaceByRegExp(MyString, "\\\", Chr(3))
MyString = ReplaceByRegExp(MyString, "\\S([^;]*?)(\^|#)([^;]*?);", "$1$3")
MyString = ReplaceByRegExp(MyString, "\\S([^;]*?);", "$1")
MyString = ReplaceByRegExp(MyString, "(\\P|\\O|\\o|\\L|\\l|\{|\})", "")
MyString = ReplaceByRegExp(MyString, "\\[^;]*?;", "")
MyString = ReplaceByRegExp(MyString, "\x01", "{")
MyString = ReplaceByRegExp(MyString, "\x02", "}")
MyString = ReplaceByRegExp(MyString, "\x03", "")
MtextStringClearFormat = Trim(MyString)
End Function
Public Function ReplaceByRegExp(ByVal Mystrig As String, ByVal TxtFind As String, ByVal TxtReplace As String)
Dim RE As Object
Set RE = ThisDrawing.Application.GetInterfaceObject("Vbscript.RegExp")
RE.IgnoreCase = False
RE.Global = True
RE.Pattern = TxtFind
ReplaceByRegExp = RE.Replace(Mystrig, TxtReplace)
Set RE = Nothing
End Function
'计算两点之间距离
Public Function GetDistance(sp As Variant, ep As Variant) As Double
Dim x As Double
Dim y As Double
Dim z As Double
x = sp(0) - ep(0)
y = sp(1) - ep(1)
z = sp(2) - ep(2)
GetDistance = Sqr((Sqr((x ^ 2) + (y ^ 2)) ^ 2) + (z ^ 2))
End Function
本帖最后由 jepvyg 于 2022-1-4 13:44 编辑
发现太白了,改进了下,还是那个问题,好像对象多了,就选不中了,不知道,怎么办。
Option Explicit
Public Sub MTextTotext()
On Error Resume Next
Dim ptInsert As Variant
Dim txtStr As String
Dim height As Double
Dim width As Double, bbg As Double
Dim k As Double, oScale As Double
Dim pt1, pt2, pt3
k = 0.4
'确定选择范围区以及表格现有的标高*********************************************
pt1 = ThisDrawing.Utility.GetPoint(, "框选左上角一个点: ")
pt2 = ThisDrawing.Utility.GetPoint(, "框选右下角一个点: ")
pt3 = ThisDrawing.Utility.GetPoint(, "将表格变成7mm高,选取左上角下方邻近点,以确定现有表格高度: ")
bbg = GetDistance(pt1, pt3)
oScale = 7 / bbg
Dim SSet As AcadSelectionSet
'选择多行文字*********************************************安全创建选择集
If Not IsNull(ThisDrawing.SelectionSets.Item("this")) Then
Set SSet = ThisDrawing.SelectionSets.Item("this")
SSet.Delete
End If
Set SSet = ThisDrawing.SelectionSets.Add("this")
SSet.Select acSelectionSetCrossing, pt1, pt2 '**********注意了就是这个有问题。也注意过,pt1(2),pt2(2)是0.都在Z平面上。
'创建单行文字***************************************************************
Dim ptMin As Variant, ptMax As Variant
Dim objText As AcadText
Dim objMText As AcadMText
For Each objMText In SSet
'获得文字的主要参数
height = objMText.height
ptInsert = objMText.InsertionPoint
ptInsert(1) = ptInsert(1) - height
txtStr = MtextStringClearFormat(objMText.TextString)
'文字的限制框宽度
Set objText = ThisDrawing.ModelSpace.AddText(txtStr, ptInsert, height)
objText.ScaleFactor = k
objMText.Delete'删除原来的多行文字
Next
For Each objText In SSet
'获得文字的主要参数
objText.ScaleFactor = k '单行文字宽度比例改为K
Next
Dim objEnt As AcadEntity
For Each objEnt In SSet '按比例缩放
objEnt.ScaleEntity pt1, oScale
Next
SSet.Delete
End Sub
Public Function MtextStringClearFormat(MTextString As String) As String '清除掉多行文字中的格式。
Dim MyString As String
MyString = MTextString
MyString = ReplaceByRegExp(MyString, "\\{", Chr(1))
MyString = ReplaceByRegExp(MyString, "\\}", Chr(2))
MyString = ReplaceByRegExp(MyString, "\\\\", Chr(3))
MyString = ReplaceByRegExp(MyString, "\\S([^;]*?)(\^|#)([^;]*?);", "$1$3")
MyString = ReplaceByRegExp(MyString, "\\S([^;]*?);", "$1")
MyString = ReplaceByRegExp(MyString, "(\\P|\\O|\\o|\\L|\\l|\{|\})", "")
MyString = ReplaceByRegExp(MyString, "\\[^;]*?;", "")
MyString = ReplaceByRegExp(MyString, "\x01", "{")
MyString = ReplaceByRegExp(MyString, "\x02", "}")
MyString = ReplaceByRegExp(MyString, "\x03", "\")
MtextStringClearFormat = Trim(MyString)
End Function
Public Function ReplaceByRegExp(ByVal Mystrig As String, ByVal TxtFind As String, ByVal TxtReplace As String)
Dim RE As Object
Set RE = ThisDrawing.Application.GetInterfaceObject("Vbscript.RegExp")
RE.IgnoreCase = False
RE.Global = True
RE.Pattern = TxtFind
ReplaceByRegExp = RE.Replace(Mystrig, TxtReplace)
Set RE = Nothing
End Function
'计算两点之间距离
Public Function GetDistance(sp As Variant, ep As Variant) As Double
Dim x As Double
Dim y As Double
Dim z As Double
x = sp(0) - ep(0)
y = sp(1) - ep(1)
z = sp(2) - ep(2)
GetDistance = Sqr((Sqr((x ^ 2) + (y ^ 2)) ^ 2) + (z ^ 2))
End Function
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=175903&highlight=%D1%A1%D4%F1%BC%AF
想不到自己找到原因了。
感谢http://www.mjtd.com/home.php?mod=space&uid=63914 jepvyg 发表于 2022-1-4 13:58
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=175903&highlight=%D1%A1%D4%F1%BC%AF
想不到自己找到 ...
厉害楼主牛逼class
页:
[1]