面积/介电常数脚本文件
你好我有一个autocad scr文件,它绘制了一条多段线
我可以使用以下命令返回多段线的面积
地区
o
0,60
这给了我面积=177529.36,周长=2510.37
有没有办法把这些数字作为文字添加到图纸中?
或者我可以使用任何命令来查找多段线的objectid,以便使用
%%).区域\f“%lu2”>% 测试一次。。。
(defun c:PLabel (/ #Obj #Pnt #Id)
(vl-load-com)
(and (setq #Obj (car (entsel "\nSelect LWPolyline: ")))
(or (eq "LWPOLYLINE" (cdr (assoc 0 (entget #Obj))))
(alert "Invalid object!")
) ;_ or
(setq #Pnt (getpoint "\nSpecify MText placement point: "))
(setq #Id (itoa (vla-get-objectid (vlax-ename->vla-object #Obj))))
(entmakex
(list '(0 . "MTEXT")
'(100 . "AcDbEntity")
'(100 . "AcDbMText")
'(71 . 5)
(cons 7 (getvar 'textstyle))
(cons 10 #Pnt)
(cons 1
(strcat
"Area: %<\\AcObjProp Object(%<\\_ObjId " #Id
">%).Area \\f \"%lu2\">%\\PPerimeter: %<\\AcObjProp Object(%<\\_ObjId " #Id
" >%).Length \\f \"%lu2\">%"
) ;_ strcat
) ;_ cons
) ;_ list
) ;_ entmakex
) ;_ and
(princ)
) ;_ defun
呃,谢谢,但我如何在scr文件中使用它? 你好
试试这个:
(defun c:GetAreas (/ *error* lst->str DOC IDS PT SS UFLAG)
(vl-load-com)
;; Lee Mac~18.03.10
(defun *error* (msg)
(and uFlag (vla-EndUndomark doc))
(or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
(princ (strcat "\n** Error: " msg " **")))
(princ))
(defun lst->str (lst d1 d2)
(if (cdr lst)
(strcat d1 (car lst) d2 (lst->str (cdr lst) d1 d2))
(strcat d1 (car lst))))
(if (and (ssget '((0 . "ARC,CIRCLE,ELLIPE,HATCH,*POLYLINE,REGION")))
(setq pt (getpoint "\nPick Point for Field: ")))
(progn
(setq uFlag (not (vla-StartUndoMark
(setq doc (vla-get-ActiveDocument
(vlax-get-acad-object))))))
(vlax-for obj (setq ss (vla-get-ActiveSelectionSet doc))
(setq Ids (cons (itoa (vla-get-ObjectId obj)) Ids)))
(vla-delete ss)
(vla-AddMText
(if (or (eq AcModelSpace (vla-get-ActiveSpace doc))
(eq :vlax-true (vla-get-MSpace doc)))
(vla-get-ModelSpace doc)
(vla-get-PaperSpace doc))
(vlax-3D-point pt) 0.
(if (= 1 (length Ids))
(strcat "%<\\AcObjProp Object(%<\\_ObjId " (car Ids) ">%).Area \\f \"%lu6%qf1\">%")
(strcat "%<\\AcExpr" (lst->str Ids " %<\\AcObjProp Object(%<\\_ObjId " ">%).Area >% +")
">%).Area >% \\f \"%lu6%qf1\">%")))
(setq uFlag (vla-EndUndomark doc))))
(princ))
也谢谢,你能告诉我如何使用上面的代码来获得我想要的结果吗。
对AutoCad来说有点陌生。谢谢 也许可以看看这里:
http://www.cadtutor.net/forum/showthread.php?t=1390
嗯,结果适得其反!!! 是的,由于字段对象存储在文本字典中,而文本字典存储在ACAD_字段字典中,字段字典本身存储在文本、多行文字或属性的扩展字典中(无论您创建的是哪一个),因此无法使用entmake轻松创建字段。因此,要使用entmake,您必须在多行文字扩展词典中输入这些词典。
李 面积和周长的另一种变体
(defun c:GetAP (/ *error* lst->str DOC IDS PT SS UFLAG)
(vl-load-com)
;; Lee Mac~18.03.10
(defun *error* (msg)
(and uFlag (vla-EndUndomark doc))
(or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
(princ (strcat "\n** Error: " msg " **")))
(princ))
(defun lst->str (lst d1 d2)
(if (cdr lst)
(strcat d1 (car lst) d2 (lst->str (cdr lst) d1 d2))
(strcat d1 (car lst))))
(princ "\nSelect Objects to Retrieve Total Area + Perimeter...")
(if (and (ssget '((0 . "ARC,CIRCLE,ELLIPE,HATCH,*POLYLINE,REGION")))
(setq pt (getpoint "\nPick Point for Field: ")))
(progn
(setq uFlag (not (vla-StartUndoMark
(setq doc (vla-get-ActiveDocument
(vlax-get-acad-object))))))
(vlax-for obj (setq ss (vla-get-ActiveSelectionSet doc))
(setq Ids (cons (itoa (vla-get-ObjectId obj)) Ids)))
(vla-delete ss)
(vla-AddMText
(if (or (eq AcModelSpace (vla-get-ActiveSpace doc))
(eq :vlax-true (vla-get-MSpace doc)))
(vla-get-ModelSpace doc)
(vla-get-PaperSpace doc))
(vlax-3D-point pt) 0.
(if (= 1 (length Ids))
(strcat "Area: %<\\AcObjProp Object(%<\\_ObjId "
(car Ids) ">%).Area \\f \"%lu6%qf1\">%"
"\\PPerimeter: %<\\AcObjProp Object(%<\\_ObjId "
(car Ids) ">%).Length \\f \"%lu6\">%")
(strcat "Area: %<\\AcExpr"
(lst->str Ids " %<\\AcObjProp Object(%<\\_ObjId " ">%).Area >% +")
">%).Area >% \\f \"%lu6%qf1\">%"
"\\PPerimeter: %<\\AcExpr"
(lst->str Ids " %<\\AcObjProp Object(%<\\_ObjId " ">%).Length >% +")
">%).Length >% \\f \"%lu6\">%")))
(setq uFlag (vla-EndUndomark doc))))
(princ))
是的,我没想过。它放置字段,但您必须编辑文本一次。不知道为什么我一开始就用了entmake。
只是为了它能正常工作。。。
(defun c:PLabel (/ #Obj #Pnt #Id)
(vl-load-com)
(and (setq #Obj (car (entsel "\nSelect LWPolyline: ")))
(or (eq "LWPOLYLINE" (cdr (assoc 0 (entget #Obj))))
(alert "Invalid object!")
) ;_ or
(setq #Pnt (getpoint "\nSpecify MText placement point: "))
(setq #Id (itoa (vla-get-objectid (vlax-ename->vla-object #Obj))))
(AT:MText #Pnt
(strcat
"Area: %<\\AcObjProp Object(%<\\_ObjId " #Id
">%).Area \\f \"%lu2\">%\\PPerimeter: %<\\AcObjProp Object(%<\\_ObjId " #Id
" >%).Length \\f \"%lu2\">%"
) ;_ strcat
0
nil
5
) ;_ AT:MText
) ;_ and
(princ)
) ;_ defun
;;; Add MText to drawing
;;; #InsertionPoint - MText insertion point
;;; #String - String to place in created MText object
;;; #Width - Width of MText object (if nil, will be 0 width)
;;; #Layer - Layer to place Mtext object on (nil for current)
;;; #Justification - Justification # for Mtext object
;;; 1 or nil= TopLeft
;;; 2= TopCenter
;;; 3= TopRight
;;; 4= MiddleLeft
;;; 5= MiddleCenter
;;; 6= MiddleRight
;;; 7= BottomLeft
;;; 8= BottomCenter
;;; 9= BottomRight
;;; Alan J. Thompson, 05.23.09
(defun AT:MText (#InsertionPoint #String #Width #Layer #Justification / #Width
#Space #Insertion #Object
)
(or #Width (setq #Width 0))
(or *AcadDoc*
(setq *AcadDoc* (vla-get-activedocument (vlax-get-acad-object)))
) ;_ or
(setq #Space (if (or (eq acmodelspace
(vla-get-activespace *AcadDoc*)
) ;_ eq
(eq :vlax-true (vla-get-mspace *AcadDoc*))
) ;_ or
(vla-get-modelspace *AcadDoc*)
(vla-get-paperspace *AcadDoc*)
) ;_ if
#Insertion (cond
((vl-consp #InsertionPoint) (vlax-3d-point #InsertionPoint))
((eq (type #InsertionPoint) 'variant) #InsertionPoint)
(T nil)
) ;_ cond
) ;_ setq
;; create MText object
(setq #Object (vla-addmtext #Space #Insertion #Width #String))
;; change layer, if applicable
(and #Layer
(tblsearch "layer" #Layer)
(vla-put-layer #Object #Layer)
) ;_ and
;; change justification & match insertion point with new justification
(cond ((member #Justification (list 1 2 3 4 5 6 7 8 9))
(vla-put-attachmentpoint #Object #Justification)
(vla-move #Object
(vla-get-InsertionPoint #Object)
#Insertion
) ;_ vla-move
)
) ;_ cond
#Object
) ;_ defun
页:
[1]
2