乐筑天下

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

[编程交流] 展开文本例程以包含

[复制链接]

88

主题

346

帖子

281

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
423
发表于 2022-7-6 12:12:09 | 显示全部楼层 |阅读模式
我有一个例程,在文本对象周围添加括号。
我不知道如何修改此代码以包括多行文字、维度和多重引线对象。(任何其他文本类型对象??)
 
我希望有一个更高效的编码版本,但首先我想
查看如何修改我的代码以包含这些其他对象。
(我还在学习……)
 
(默认c:PT(/ss len count ent text)
(SETVAR“CMDECHO”0)
(命令“UNDO”“M”)
(提示“\n在选定文本周围加括号:”)
(setq olderr*错误*
*错误*ULERR)
(提示“\n选择文本:”)
(SETQ SS(SSGET)
LEN(SSLENGTH SS)
计数0)
(WHILE(NOT(等于LEN COUNT))
(SETQ ENT(ENTGET(SSNAME SS COUNT)))
(IF(等于(CDR(ASSOC 0 ENT))“TEXT”)
(程序
(SETQ文本(CDR(ASSOC 1 ENT))
文本(“文本”)
ENT(SUBST(CONS 1文本)
(ASSOC 1 ENT)
(ENTMOD ENT)))
(SETQ计数(1+计数)))
(普林斯)
 
再次感谢你们不仅帮助了我
但是对于你写的所有代码!这有点让人不知所措。。。
 
再次感谢!!
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 12:25:33 | 显示全部楼层
 
我会用这样的东西
 
  1. (defun c:atp  (/ count en ent len ss text)
  2. (command "._undo" "_be")
  3. (prompt "\nAdds parenthesis round selected text: ")
  4. (setq        ss    (ssget (list (cons 0 "*TEXT,DIMENSION,MULTILEADER")))
  5. len   (sslength ss)
  6. count 0)
  7. (while (not (equal len count))
  8.    (setq ent (entget (setq en (ssname ss count))))
  9.    (cond
  10.      ((wcmatch (cdr (assoc 0 ent)) "*TEXT")
  11.       (setq text (cdr (assoc 1 ent))
  12.      text (strcat "(" text ")")
  13.      ent  (subst (cons 1 text)
  14.                  (assoc 1 ent)
  15.                  ent)))
  16.      ((equal (cdr (assoc 0 ent)) "DIMENSION")
  17.       (progn
  18. (setq text (cdr (assoc 1 ent))
  19.        text "(<>)"
  20.        ent  (subst (cons 1 text)
  21.                    (assoc 1 ent)
  22.                    ent))
  23. ))
  24.      ((equal (cdr (assoc 0 ent)) "MULTILEADER")
  25.       (progn
  26. (setq text (cdr (assoc 304 ent))
  27.        text (strcat "(" text ")")
  28.        ent  (subst (cons 304 text)
  29.                    (assoc 304 ent)
  30.                    ent))
  31. ))
  32.      )
  33.    (entmod ent)
  34.    (setq count (1+ count))
  35.    )
  36. (command "._undo" "_e")
  37. (princ)
  38. )

 
~'J'~
回复

使用道具 举报

88

主题

346

帖子

281

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
423
发表于 2022-7-6 12:32:24 | 显示全部楼层
谢谢
 
作品完美!!!
 
那么v-lisp或C中的高端编码版本呢?
 
这是一个很好的学习工具,可以将简单的lisp与
其他语言版本。
 
非常感谢!!!
回复

使用道具 举报

88

主题

346

帖子

281

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
423
发表于 2022-7-6 12:48:05 | 显示全部楼层
谢谢
 
如果你有机会,我们将不胜感激!!
我们在维度周围使用括号来表示它们是近似值。
(这是他们的标准)在其他任何地方,我们都使用瓷砖。
 
我不需要制定规则。。。
我只需要由他们起草!!(^_^)
 
我将尝试找出如何添加维度。
如果我想不出来,我会再次打扰你。。。
 
再次感谢!
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 12:57:04 | 显示全部楼层
 
这也是VLisp版本
  1. (defun C:Par (/ *error* adoc axss obj_type)
  2. (defun *error*        (msg)
  3. (if
  4.    (vl-position
  5.      msg
  6.      '("console break"
  7. "Function cancelled"
  8. "quit / exit abort"
  9. )
  10.      )
  11.     (princ "Error!")
  12.     (princ msg))
  13.    (vla-startundomark
  14.      (vla-get-activedocument
  15.        (vlax-get-acad-object)
  16.      )
  17.      )
  18.     )
  19. ;;main part
  20.      (setq adoc
  21.      (vla-get-activedocument
  22.        (vlax-get-acad-object)
  23.      )
  24.      )
  25. (vla-startundomark adoc)
  26. (setq axss (vla-get-pickfirstselectionset adoc))
  27. (vla-clear axss)
  28. (vla-selectonscreen
  29.    axss
  30.    (vlax-safearray-fill
  31.      (vlax-make-safearray vlax-vbinteger '(0 . 4))
  32.      '(-4 0 0 0 -4))
  33.    (vlax-safearray-fill
  34.      (vlax-make-safearray vlax-vbvariant '(0 . 4))
  35.      '("<OR" "*TEXT" "DIMENSION" "MULTILEADER" "OR>")
  36.      )
  37.    )
  38. (vlax-for obj axss
  39.    (setq obj_type (vla-get-objectname obj))
  40.    (cond ((wcmatch obj_type "*Dimension")
  41.    (vla-put-textoverride obj "(<>)"))
  42.   ((wcmatch obj_type "*Leader,*Text")
  43.            (vla-put-textstring obj (strcat "(" (vla-get-textstring obj) ")"))
  44.    )
  45.   )
  46.    )
  47.    (princ)
  48. )
  49. (vl-load-com)

 
在C#或VB上编写它将非常容易。净额
这是一个很好的起点:
http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%20.NET%20Developer's%20指南/索引。html
 
~'J'~
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 13:10:40 | 显示全部楼层
 
这是基于Adesk指南的C#版本
轻微测试
 
  1. using System;
  2. using Autodesk.AutoCAD.Geometry;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.EditorInput;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  7. using acadApp = Autodesk.AutoCAD.ApplicationServices.Application;
  8. using Autodesk.AutoCAD.ApplicationServices;
  9. [assembly: CommandClass(typeof(SelectionCommands.FilterSelect))]
  10. namespace SelectionCommands
  11. {
  12.    public class FilterSelect
  13.    {
  14.        [CommandMethod("FM")]
  15.        public static void AddParenthesis()
  16.        {
  17.            // Get the current document
  18.            Document doc = acadApp.DocumentManager.MdiActiveDocument;
  19.            // Get the current document editor
  20.            Editor ed = doc.Editor;
  21.            // Get the current database
  22.            Database db = doc.Database;
  23.            using (Transaction tr = db.TransactionManager.StartTransaction())
  24.            {
  25.                // Create a TypedValue array to define the filter criteria
  26.                TypedValue[] ftype =
  27.                    new TypedValue[]
  28. {
  29.    new TypedValue((int)DxfCode.Operator, "<OR"),
  30.    new TypedValue((int)DxfCode.Start, "*TEXT"),//Text and MText
  31.    new TypedValue((int)DxfCode.Start, "DIMENSION"),
  32.    new TypedValue((int)DxfCode.Start, "*LEADER"),//Leader and MLeader
  33.    new TypedValue((int)DxfCode.Operator, "OR>")
  34. };
  35.                // Assign the filter criteria to a SelectionFilter object
  36.                SelectionFilter fltr = new SelectionFilter(ftype);
  37.                // Request for objects to be selected in the drawing area
  38.                PromptSelectionResult psr;
  39.                psr = ed.GetSelection(fltr);
  40.                SelectionSet sset = null;
  41.                // If the prompt status is OK, objects were selected
  42.                if (psr.Status == PromptStatus.OK)
  43.                {
  44.                    sset = psr.Value;
  45.                    acadApp.ShowAlertDialog("Number of objects selected: " +
  46.                                                sset.Count.ToString());
  47.                }
  48.                else
  49.                {
  50.                    acadApp.ShowAlertDialog("Number of objects selected: 0");
  51.                }
  52.                // iterate through selected objects
  53.                foreach (ObjectId id in sset.GetObjectIds())
  54.                {
  55.                    DBObject obj = (DBObject)tr.GetObject(id, OpenMode.ForRead);
  56.                    // catch object name
  57.                    string objname = obj.GetRXClass().Name;
  58.                    ed.WriteMessage("\n{0}", objname);// debug only
  59.                    try
  60.                    {
  61.                        switch (objname)
  62.                        {
  63.                            case "AcDbText":
  64.                                DBText txt = obj as DBText;
  65.                                txt.UpgradeOpen();
  66.                                txt.TextString = "(" + txt.TextString + ")";
  67.                                break;
  68.                            case "AcDbMText":
  69.                                MText mtx = obj as MText;
  70.                                mtx.UpgradeOpen();
  71.                                mtx.Contents = "(" + mtx.Contents + ")";
  72.                                break;
  73.                            case "AcDbLeader":
  74.                                Leader ld = obj as Leader;
  75.                                if (ld.AnnoType == AnnotationType.MText)
  76.                                {
  77.                                    MText ldtxt = (MText)tr.GetObject(ld.Annotation, OpenMode.ForRead);
  78.                                    if (ldtxt != null)
  79.                                    {
  80.                                        ld.UpgradeOpen();
  81.                                        ldtxt.UpgradeOpen();
  82.                                        ldtxt.Contents = "(" + ldtxt.Contents + ")";
  83.                                    }
  84.                                }
  85.                                break;
  86.                            case "AcDbMLeader":
  87.                                MLeader mld = obj as MLeader;
  88.                                if (mld.ContentType == ContentType.MTextContent)
  89.                                {
  90.                                    MText mt = new MText();
  91.                                    mt.SetDatabaseDefaults();
  92.                                    mt.SetPropertiesFrom(mld.MText as Entity);
  93.                                    mt.Contents = "(" + mld.MText.Text + ")";
  94.                                    mld.UpgradeOpen();
  95.                                    mld.MText = mt;
  96.                                }
  97.                                break;
  98.                            //varios object names:
  99.                            //AcDbRotatedDimension
  100.                            //AcDbAlignedDimension
  101.                            //AcDb2LineAngularDimension
  102.                            //AcDbRadialDimension
  103.                            //AcDbDiametricDimension
  104.                            //AcDbOrdinateDimension
  105.                            //AcDbArcDimension
  106.                            case "AcDbRotatedDimension":
  107.                                RotatedDimension rd = obj as RotatedDimension;
  108.                                rd.UpgradeOpen();
  109.                                rd.DimensionText = "(<>)";
  110.                                break;
  111.                            case "AcDbAlignedDimension":
  112.                                AlignedDimension ad = obj as AlignedDimension;
  113.                                ad.UpgradeOpen();
  114.                                ad.DimensionText = "(<>)";
  115.                                break;
  116.                            case "AcDbOrdinateDimension":
  117.                                OrdinateDimension od = obj as OrdinateDimension;
  118.                                od.UpgradeOpen();
  119.                                od.DimensionText = "(<>)";
  120.                                break; //etc. etc.
  121.                        }
  122.                    }
  123.                    catch (Autodesk.AutoCAD.Runtime.Exception ex)
  124.                    {
  125.                        acadApp.ShowAlertDialog(ex.Message);
  126.                    }
  127.                }
  128.                tr.Commit();
  129.            } //dispose transaction
  130.        }
  131.    }
  132. }

 
~'J'~
回复

使用道具 举报

88

主题

346

帖子

281

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
423
发表于 2022-7-6 13:14:51 | 显示全部楼层
非常感谢你们!!
 
你太棒了!!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-5 10:05 , Processed in 0.496830 second(s), 66 queries .

© 2020-2025 乐筑天下

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