乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 120|回复: 2

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

[复制链接]

1

主题

2

帖子

1

银币

初来乍到

Rank: 1

铜币
6
发表于 2022-1-4 12:37:00 | 显示全部楼层 |阅读模式
发错位置了,对不起各位。
这个程序准备用于图纸内的表格输出,本人水平有限,所以前期就是将表格中的多行文字转为单行文字,再将单行文字宽高比改小。最后,将整个表格的高度改为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

回复

使用道具 举报

75

主题

306

帖子

10

银币

中流砥柱

Rank: 25

铜币
606
发表于 2022-2-5 15:09:00 | 显示全部楼层
通过交互方式进行选择时,要确保被选择的对象在视图范围内(即可见),不在范围内的对象经常选不中,注意到这点,选择应该不会出什么问题。
回复

使用道具 举报

1

主题

2

帖子

1

银币

初来乍到

Rank: 1

铜币
6
发表于 2022-2-8 13:07:00 | 显示全部楼层
谢谢,就是你说的这个原因。
这个贴子我发错了位置。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-21 20:35 , Processed in 0.204642 second(s), 58 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表