ILoveMadoka 发表于 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+计数)))
(普林斯)
 
再次感谢你们不仅帮助了我
但是对于你写的所有代码!这有点让人不知所措。。。
 
再次感谢!!

fixo 发表于 2022-7-6 12:25:33

 
我会用这样的东西
 

(defun c:atp(/ count en ent len ss text)

(command "._undo" "_be")

(prompt "\nAdds parenthesis round selected text: ")

(setq        ss    (ssget (list (cons 0 "*TEXT,DIMENSION,MULTILEADER")))
len   (sslength ss)
count 0)
(while (not (equal len count))
   (setq ent (entget (setq en (ssname ss count))))
   (cond
   ((wcmatch (cdr (assoc 0 ent)) "*TEXT")
      (setq text (cdr (assoc 1 ent))
   text (strcat "(" text ")")
   ent(subst (cons 1 text)
               (assoc 1 ent)
               ent)))

   ((equal (cdr (assoc 0 ent)) "DIMENSION")
      (progn
(setq text (cdr (assoc 1 ent))
       text "(<>)"
       ent(subst (cons 1 text)
                   (assoc 1 ent)
                   ent))
))
   ((equal (cdr (assoc 0 ent)) "MULTILEADER")
      (progn
(setq text (cdr (assoc 304 ent))
       text (strcat "(" text ")")
       ent(subst (cons 304 text)
                   (assoc 304 ent)
                   ent))
))
   )
   (entmod ent)
   (setq count (1+ count))
   )
(command "._undo" "_e")

(princ)
)

 
~'J'~

ILoveMadoka 发表于 2022-7-6 12:32:24

谢谢
 
作品完美!!!
 
那么v-lisp或C中的高端编码版本呢?
 
这是一个很好的学习工具,可以将简单的lisp与
其他语言版本。
 
非常感谢!!!

ILoveMadoka 发表于 2022-7-6 12:48:05

谢谢
 
如果你有机会,我们将不胜感激!!
我们在维度周围使用括号来表示它们是近似值。
(这是他们的标准)在其他任何地方,我们都使用瓷砖。
 
我不需要制定规则。。。
我只需要由他们起草!!(^_^)
 
我将尝试找出如何添加维度。
如果我想不出来,我会再次打扰你。。。
 
再次感谢!

fixo 发表于 2022-7-6 12:57:04

 
这也是VLisp版本

(defun C:Par (/ *error* adoc axss obj_type)

(defun *error*        (msg)
(if
   (vl-position
   msg
   '("console break"
"Function cancelled"
"quit / exit abort"
)
   )
    (princ "Error!")
    (princ msg))
   (vla-startundomark
   (vla-get-activedocument
       (vlax-get-acad-object)
   )
   )
    )

;;main part

   (setq adoc
   (vla-get-activedocument
       (vlax-get-acad-object)
   )
   )
(vla-startundomark adoc)

(setq axss (vla-get-pickfirstselectionset adoc))
(vla-clear axss)
(vla-selectonscreen
   axss
   (vlax-safearray-fill
   (vlax-make-safearray vlax-vbinteger '(0 . 4))
   '(-4 0 0 0 -4))
   (vlax-safearray-fill
   (vlax-make-safearray vlax-vbvariant '(0 . 4))
   '("<OR" "*TEXT" "DIMENSION" "MULTILEADER" "OR>")
   )
   )

(vlax-for obj axss
   (setq obj_type (vla-get-objectname obj))
   (cond ((wcmatch obj_type "*Dimension")
   (vla-put-textoverride obj "(<>)"))
((wcmatch obj_type "*Leader,*Text")
         (vla-put-textstring obj (strcat "(" (vla-get-textstring obj) ")"))
   )
)
   )
   (princ)
)
(vl-load-com)

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

fixo 发表于 2022-7-6 13:10:40

 
这是基于Adesk指南的C#版本
轻微测试
 

using System;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.DatabaseServices;
using AcDb = Autodesk.AutoCAD.DatabaseServices;
using acadApp = Autodesk.AutoCAD.ApplicationServices.Application;
using Autodesk.AutoCAD.ApplicationServices;




namespace SelectionCommands
{
   public class FilterSelect
   {
      
       public static void AddParenthesis()
       {
         // Get the current document
         Document doc = acadApp.DocumentManager.MdiActiveDocument;
         // Get the current document editor
         Editor ed = doc.Editor;
         // Get the current database
         Database db = doc.Database;
         using (Transaction tr = db.TransactionManager.StartTransaction())
         {
               // Create a TypedValue array to define the filter criteria

               TypedValue[] ftype =
                   new TypedValue[]
{
   new TypedValue((int)DxfCode.Operator, "<OR"),
   new TypedValue((int)DxfCode.Start, "*TEXT"),//Text and MText
   new TypedValue((int)DxfCode.Start, "DIMENSION"),
   new TypedValue((int)DxfCode.Start, "*LEADER"),//Leader and MLeader
   new TypedValue((int)DxfCode.Operator, "OR>")
};
               // Assign the filter criteria to a SelectionFilter object
               SelectionFilter fltr = new SelectionFilter(ftype);

               // Request for objects to be selected in the drawing area
               PromptSelectionResult psr;
               psr = ed.GetSelection(fltr);
               SelectionSet sset = null;
               // If the prompt status is OK, objects were selected
               if (psr.Status == PromptStatus.OK)
               {
                   sset = psr.Value;

                   acadApp.ShowAlertDialog("Number of objects selected: " +
                                             sset.Count.ToString());
               }
               else
               {
                   acadApp.ShowAlertDialog("Number of objects selected: 0");
               }
               // iterate through selected objects
               foreach (ObjectId id in sset.GetObjectIds())
               {
                   DBObject obj = (DBObject)tr.GetObject(id, OpenMode.ForRead);
                   // catch object name
                   string objname = obj.GetRXClass().Name;

                   ed.WriteMessage("\n{0}", objname);// debug only

                   try
                   {
                     switch (objname)
                     {
                           case "AcDbText":
                               DBText txt = obj as DBText;
                               txt.UpgradeOpen();
                               txt.TextString = "(" + txt.TextString + ")";
                               break;
                           case "AcDbMText":
                               MText mtx = obj as MText;
                               mtx.UpgradeOpen();
                               mtx.Contents = "(" + mtx.Contents + ")";
                               break;
                           case "AcDbLeader":
                               Leader ld = obj as Leader;
                               if (ld.AnnoType == AnnotationType.MText)
                               {
                                 MText ldtxt = (MText)tr.GetObject(ld.Annotation, OpenMode.ForRead);
                                 if (ldtxt != null)
                                 {
                                       ld.UpgradeOpen();
                                       ldtxt.UpgradeOpen();
                                       ldtxt.Contents = "(" + ldtxt.Contents + ")";
                                 }
                               }
                               break;
                           case "AcDbMLeader":
                               MLeader mld = obj as MLeader;

                               if (mld.ContentType == ContentType.MTextContent)
                               {
                                 MText mt = new MText();
                                 mt.SetDatabaseDefaults();
                                 mt.SetPropertiesFrom(mld.MText as Entity);
                                 mt.Contents = "(" + mld.MText.Text + ")";
                                 mld.UpgradeOpen();
                                 mld.MText = mt;
                               }
                               break;
                           //varios object names:
                           //AcDbRotatedDimension
                           //AcDbAlignedDimension
                           //AcDb2LineAngularDimension
                           //AcDbRadialDimension
                           //AcDbDiametricDimension
                           //AcDbOrdinateDimension
                           //AcDbArcDimension
                           case "AcDbRotatedDimension":
                               RotatedDimension rd = obj as RotatedDimension;
                               rd.UpgradeOpen();
                               rd.DimensionText = "(<>)";
                               break;
                           case "AcDbAlignedDimension":
                               AlignedDimension ad = obj as AlignedDimension;
                               ad.UpgradeOpen();
                               ad.DimensionText = "(<>)";
                               break;
                           case "AcDbOrdinateDimension":
                               OrdinateDimension od = obj as OrdinateDimension;
                               od.UpgradeOpen();
                               od.DimensionText = "(<>)";
                               break; //etc. etc.
                     }
                   }
                   catch (Autodesk.AutoCAD.Runtime.Exception ex)
                   {
                     acadApp.ShowAlertDialog(ex.Message);
                   }
               }
               tr.Commit();
         } //dispose transaction
       }
   }
}

 
~'J'~

ILoveMadoka 发表于 2022-7-6 13:14:51

非常感谢你们!!
 
你太棒了!!
页: [1]
查看完整版本: 展开文本例程以包含