明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 767|回复: 3

做了个CAD 输出表格的前置,有个选择集的问题,大神来看下。

[复制链接]
发表于 2022-1-4 12:40 | 显示全部楼层 |阅读模式
这个程序准备用于图纸内的表格输出,本人水平有限,所以前期就是将表格中的多行文字转为单行文字,再将单行文字宽高比改小。最后,将整个表格的高度改为7,文字近似为3.5。这样处理后,再用贱人工具箱的功能,将表格输出。后期有时间再把贱人输出表格的功能加进去。
现在的问题是,现在的选择集不太靠谱:①第三次运行选择集时,在本地窗口中,发现预计框选的数量和sset选择集中的cout数量不一样,差好多,而且同一张表,复制几份,每份运行的结果都不一样(当然也有时,运行的结果是正确的);②第二次运行选择集时,每次数量都不包括第一次选择集中新建的单行文字的数量。
  1. Option Explicit

  2. Public Sub MTextTotext()

  3.     On Error Resume Next

  4.     Dim ptInsert As Variant

  5.     Dim txtStr As String

  6.     Dim height As Double

  7.     Dim width As Double, bbg As Double

  8.     Dim k As Double, oScale As Double

  9.     Dim pt1, pt2, pt3   

  10.     k = 0.4   

  11.     '确定选择范围区以及表格现有的标高*********************************************

  12.     pt1 = ThisDrawing.Utility.GetPoint(, "框选左上角一个点: ")

  13.     pt2 = ThisDrawing.Utility.GetPoint(, "框选右下角一个点: ")

  14.     pt3 = ThisDrawing.Utility.GetPoint(, "将表格变成7mm高,选取左上角下方邻近点,以确定现有表格高度: ")

  15.     bbg = GetDistance(pt1, pt3)

  16.     Dim SSet As AcadSelectionSet

  17.     oScale = 7 / bbg   

  18.     '选择多行文字*********************************************

  19.     '安全创建选择集

  20.     If Not IsNull(ThisDrawing.SelectionSets.Item("this")) Then

  21.         Set SSet = ThisDrawing.SelectionSets.Item("this")

  22.         SSet.Delete

  23.     End If

  24.     Set SSet = ThisDrawing.SelectionSets.Add("this")

  25.     '定义过滤规则

  26.     Dim filterType(0) As Integer

  27.     Dim filterData(0) As Variant

  28.     filterType(0) = 0

  29.     filterData(0) = "MText"

  30.     SSet.Select acSelectionSetCrossing, pt1, pt2, filterType, filterData

  31.     '创建单行文字***************************************************************

  32.     Dim ptMin As Variant, ptMax As Variant

  33.     Dim objText As AcadText

  34.     Dim objMText As AcadMText

  35.     For Each objMText In SSet

  36.         '获得文字的主要参数

  37.         height = objMText.height

  38.         ptInsert = objMText.InsertionPoint

  39.         ptInsert(1) = ptInsert(1) - height

  40.         txtStr = MtextStringClearFormat(objMText.TextString)

  41.         '文字的限制框宽度

  42.         Set objText = ThisDrawing.ModelSpace.AddText(txtStr, ptInsert, height)

  43.         objText.ScaleFactor = k

  44.         objMText.Delete  '删除原来的多行文字

  45.     Next

  46.     SSet.Delete

  47.      '第二步,在上一步的基础上,实现所有单行文字宽高比,变成K。

  48.       '安全创建选择集

  49.     If Not IsNull(ThisDrawing.SelectionSets.Item("this")) Then

  50.         Set SSet = ThisDrawing.SelectionSets.Item("this")

  51.         SSet.Delete

  52.     End If

  53.     Set SSet = ThisDrawing.SelectionSets.Add("this")

  54.     '定义过滤规则,选持单行文字。

  55.     filterType(0) = 0

  56.     filterData(0) = "Text"

  57.     SSet.Select acSelectionSetCrossing, pt1, pt2, filterType, filterData

  58.     For Each objText In SSet

  59.         objText.ScaleFactor = k

  60.     Next

  61.     SSet.Delete   

  62.     '第三步,表格整体缩放,在现在表格标高的基础上,将单表格高度整体缩放为7mm高,此时文字大概的高度为3.5mm,标准化后以便下一步操作。

  63.     '安全创建选择集

  64.     Dim objEnt As AcadEntity

  65.     If Not IsNull(ThisDrawing.SelectionSets.Item("this")) Then

  66.         Set SSet = ThisDrawing.SelectionSets.Item("this")

  67.         SSet.Delete

  68.     End If

  69.     Set SSet = ThisDrawing.SelectionSets.Add("this")   

  70.     SSet.Select acSelectionSetCrossing, pt1, pt2

  71.     For Each objEnt In SSet

  72.         objEnt.ScaleEntity pt1, oScale

  73.     Next           

  74.     SSet.Delete

  75. End Sub

  76. Public Function MtextStringClearFormat(MTextString As String) As String '清除掉多行文字中的格式。

  77.     Dim MyString As String

  78.     MyString = MTextString

  79.     MyString = ReplaceByRegExp(MyString, "\\{", Chr(1))

  80.     MyString = ReplaceByRegExp(MyString, "\\}", Chr(2))

  81.     MyString = ReplaceByRegExp(MyString, "\\", Chr(3))

  82.     MyString = ReplaceByRegExp(MyString, "\\S([^;]*?)(\^|#)([^;]*?);", "$1$3")

  83.     MyString = ReplaceByRegExp(MyString, "\\S([^;]*?);", "$1")

  84.     MyString = ReplaceByRegExp(MyString, "(\\P|\\O|\\o|\\L|\\l|\{|\})", "")

  85.     MyString = ReplaceByRegExp(MyString, "\\[^;]*?;", "")

  86.     MyString = ReplaceByRegExp(MyString, "\x01", "{")

  87.     MyString = ReplaceByRegExp(MyString, "\x02", "}")

  88.     MyString = ReplaceByRegExp(MyString, "\x03", "")

  89.    MtextStringClearFormat = Trim(MyString)

  90. End Function

  91. Public Function ReplaceByRegExp(ByVal Mystrig As String, ByVal TxtFind As String, ByVal TxtReplace As String)

  92.      Dim RE As Object

  93.      Set RE = ThisDrawing.Application.GetInterfaceObject("Vbscript.RegExp")   

  94.     RE.IgnoreCase = False

  95.      RE.Global = True   

  96.      RE.Pattern = TxtFind

  97.     ReplaceByRegExp = RE.Replace(Mystrig, TxtReplace)

  98.      Set RE = Nothing

  99. End Function

  100. '计算两点之间距离

  101. Public Function GetDistance(sp As Variant, ep As Variant) As Double

  102.     Dim x As Double

  103.     Dim y As Double

  104.     Dim z As Double   

  105.     x = sp(0) - ep(0)

  106.     y = sp(1) - ep(1)

  107.     z = sp(2) - ep(2)   

  108.     GetDistance = Sqr((Sqr((x ^ 2) + (y ^ 2)) ^ 2) + (z ^ 2))

  109. End Function


 楼主| 发表于 2022-1-4 13:41 | 显示全部楼层
本帖最后由 jepvyg 于 2022-1-4 13:44 编辑

发现太白了,改进了下,还是那个问题,好像对象多了,就选不中了,不知道,怎么办。
  1. Option Explicit


  2. Public Sub MTextTotext()
  3.     On Error Resume Next
  4.    
  5.     Dim ptInsert As Variant
  6.     Dim txtStr As String
  7.     Dim height As Double
  8.     Dim width As Double, bbg As Double
  9.     Dim k As Double, oScale As Double
  10.     Dim pt1, pt2, pt3
  11.     k = 0.4
  12.    

  13.     '确定选择范围区以及表格现有的标高*********************************************
  14.     pt1 = ThisDrawing.Utility.GetPoint(, "框选左上角一个点: ")
  15.     pt2 = ThisDrawing.Utility.GetPoint(, "框选右下角一个点: ")
  16.     pt3 = ThisDrawing.Utility.GetPoint(, "将表格变成7mm高,选取左上角下方邻近点,以确定现有表格高度: ")
  17.     bbg = GetDistance(pt1, pt3)
  18.    
  19.     oScale = 7 / bbg
  20.     Dim SSet As AcadSelectionSet
  21.     '选择多行文字*********************************************安全创建选择集
  22.     If Not IsNull(ThisDrawing.SelectionSets.Item("this")) Then
  23.         Set SSet = ThisDrawing.SelectionSets.Item("this")
  24.         SSet.Delete
  25.     End If
  26.     Set SSet = ThisDrawing.SelectionSets.Add("this")
  27.    


  28.     SSet.Select acSelectionSetCrossing, pt1, pt2   '**********注意了就是这个有问题。也注意过,pt1(2),pt2(2)是0.都在Z平面上。

  29.     '创建单行文字***************************************************************
  30.     Dim ptMin As Variant, ptMax As Variant
  31.     Dim objText As AcadText
  32.     Dim objMText As AcadMText
  33.     For Each objMText In SSet
  34.         '获得文字的主要参数
  35.         height = objMText.height
  36.         ptInsert = objMText.InsertionPoint
  37.         ptInsert(1) = ptInsert(1) - height
  38.         txtStr = MtextStringClearFormat(objMText.TextString)
  39.         '文字的限制框宽度
  40.         Set objText = ThisDrawing.ModelSpace.AddText(txtStr, ptInsert, height)
  41.         objText.ScaleFactor = k
  42.         objMText.Delete  '删除原来的多行文字
  43.     Next

  44.     For Each objText In SSet
  45.         '获得文字的主要参数
  46.         objText.ScaleFactor = k   '单行文字宽度比例改为K
  47.     Next

  48.     Dim objEnt As AcadEntity
  49.     For Each objEnt In SSet     '按比例缩放
  50.         objEnt.ScaleEntity pt1, oScale
  51.     Next
  52.     SSet.Delete
  53. End Sub



  54. Public Function MtextStringClearFormat(MTextString As String) As String '清除掉多行文字中的格式。
  55.     Dim MyString As String
  56.     MyString = MTextString
  57.     MyString = ReplaceByRegExp(MyString, "\\{", Chr(1))
  58.     MyString = ReplaceByRegExp(MyString, "\\}", Chr(2))
  59.     MyString = ReplaceByRegExp(MyString, "\\\", Chr(3))
  60.     MyString = ReplaceByRegExp(MyString, "\\S([^;]*?)(\^|#)([^;]*?);", "$1$3")
  61.     MyString = ReplaceByRegExp(MyString, "\\S([^;]*?);", "$1")
  62.     MyString = ReplaceByRegExp(MyString, "(\\P|\\O|\\o|\\L|\\l|\{|\})", "")
  63.     MyString = ReplaceByRegExp(MyString, "\\[^;]*?;", "")
  64.     MyString = ReplaceByRegExp(MyString, "\x01", "{")
  65.     MyString = ReplaceByRegExp(MyString, "\x02", "}")
  66.     MyString = ReplaceByRegExp(MyString, "\x03", "")
  67.    MtextStringClearFormat = Trim(MyString)
  68. End Function
  69. Public Function ReplaceByRegExp(ByVal Mystrig As String, ByVal TxtFind As String, ByVal TxtReplace As String)
  70.      Dim RE As Object
  71.      Set RE = ThisDrawing.Application.GetInterfaceObject("Vbscript.RegExp")
  72.    
  73.     RE.IgnoreCase = False
  74.      RE.Global = True
  75.    
  76.      RE.Pattern = TxtFind
  77.     ReplaceByRegExp = RE.Replace(Mystrig, TxtReplace)
  78.      Set RE = Nothing
  79. End Function


  80. '计算两点之间距离
  81. Public Function GetDistance(sp As Variant, ep As Variant) As Double
  82.     Dim x As Double
  83.     Dim y As Double
  84.     Dim z As Double
  85.    
  86.     x = sp(0) - ep(0)
  87.     y = sp(1) - ep(1)
  88.     z = sp(2) - ep(2)
  89.    
  90.     GetDistance = Sqr((Sqr((x ^ 2) + (y ^ 2)) ^ 2) + (z ^ 2))
  91. End Function
 楼主| 发表于 2022-1-4 13:58 | 显示全部楼层
http://bbs.mjtd.com/forum.php?mo ... =%D1%A1%D4%F1%BC%AF
想不到自己找到原因了。
感谢
http://www.mjtd.com/home.php?mod=space&uid=63914
发表于 2022-2-11 16:25 | 显示全部楼层
jepvyg 发表于 2022-1-4 13:58
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=175903&highlight=%D1%A1%D4%F1%BC%AF
想不到自己找到 ...

厉害楼主牛逼class
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-6 03:19 , Processed in 0.278527 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表