展开文本例程以包含
我有一个例程,在文本对象周围添加括号。我不知道如何修改此代码以包括多行文字、维度和多重引线对象。(任何其他文本类型对象??)
我希望有一个更高效的编码版本,但首先我想
查看如何修改我的代码以包含这些其他对象。
(我还在学习……)
(默认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+计数)))
(普林斯)
再次感谢你们不仅帮助了我
但是对于你写的所有代码!这有点让人不知所措。。。
再次感谢!!
我会用这样的东西
(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'~ 谢谢
作品完美!!!
那么v-lisp或C中的高端编码版本呢?
这是一个很好的学习工具,可以将简单的lisp与
其他语言版本。
非常感谢!!! 谢谢
如果你有机会,我们将不胜感激!!
我们在维度周围使用括号来表示它们是近似值。
(这是他们的标准)在其他任何地方,我们都使用瓷砖。
我不需要制定规则。。。
我只需要由他们起草!!(^_^)
我将尝试找出如何添加维度。
如果我想不出来,我会再次打扰你。。。
再次感谢!
这也是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'~
这是基于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'~ 非常感谢你们!!
你太棒了!!
页:
[1]