明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 995|回复: 2

CAD 选择集的问题,各位大神帮忙看下。

[复制链接]
发表于 2022-1-4 12:37:17 | 显示全部楼层 |阅读模式
本帖最后由 jepvyg 于 2022-1-4 12:46 编辑

发错位置了,对不起各位。

这个程序准备用于图纸内的表格输出,本人水平有限,所以前期就是将表格中的多行文字转为单行文字,再将单行文字宽高比改小。最后,将整个表格的高度改为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-2-5 15:09:23 | 显示全部楼层
通过交互方式进行选择时,要确保被选择的对象在视图范围内(即可见),不在范围内的对象经常选不中,注意到这点,选择应该不会出什么问题。
 楼主| 发表于 2022-2-8 13:07:05 | 显示全部楼层
谢谢,就是你说的这个原因。
这个贴子我发错了位置。:P
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 04:43 , Processed in 0.176610 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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