将中心对准tw
大家好。我目前正在使用AutoCAD2014。
我正在尝试使用AutoLISP编写程序。
我有一些孔三维实体。
我想得到圆孔的中心和矩形孔的(长宽)。输出数据必须在autoCAD的命令提示符下打印作为输出。
这一切只需单击对象即可完成。
我在这里也提供了我的物体的图像。
求求你,谁来帮帮我。
也许将物体复制到某处爆炸两次,你可以找到圆,但矩形变为直线一点智能编码将揭示LxW使用三维实体的边界框进行限制,并复制已知数量,以便你可以计算出物体的中心点等。使用(ssget(assoc 0“圆,线”))
李·麦克发布了一个可能的解决方案http://www.cadtutor.net/forum/showthread.php?35506-如何获取区域坐标/第2页 谢谢你的帮助,但是,我不知道它不起作用的原因是什么。让我把这个问题简化一下。我最初将在这个组件的2D中工作。如果此2D组件被阻止为一个。
然后,如果我想要圆心和矩形(长宽),可以做什么?
请帮帮我。
也许你可以试着按照Marko的建议转换成block
命令:flatshot 先生,关于这件事,你能给我一些程序提示吗。因为,我对这种编码是新手,这给进一步的工作带来了困难。请帮帮我,先生。。 这个例子只是一个起点
从实体中获取圆坐标。
Alan先生(BIGAL)在2号岗位上提出的方法
更新v1.1
amili@post#15要求的额外出口csv
7/02/15
(vl-load-com)
(defun c:test (/ i e p1 p2 ss lst q var f fn dat dat1)
;hanhphuc 2014
(set 'var (getvar 'cmdecho ))
(setvar 'cmdecho 0)
(if (and (setq e (entsel "\nPlease select solid.. ")) (setq e (car e)) (= (cdr (assoc 0 (entget e))) "3DSOLID"))
(progn (vla-GetBoundingBox (setq obj (vlax-ename->vla-object e)) 'p1 'p2)
(mapcar ''((a b) (set a (vlax-safearray->list b))) '(p1 p2) (list p1 p2))
(command "_explode" e)
(setq i 0
ss(ssget "C" p1 p2)
lst (mapcar '(lambda(x)
(setq q nil)
(if
(= (cdr (assoc 0 (entget x))) "REGION")
(setq q (cons (LM:reg x) q))
(setq q (cons (vlax-ename->vla-object x) q))
)
(if
(listp q)
(LM:flatten q)
q
)
)
(vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
) ;_ end of mapcar
) ;_ end of setq
(foreach o (vl-remove-if-not ''((x) (= (vla-get-ObjectName x) "AcDbCircle")) (LM:flatten lst))
(setq dat(cons (princ (strcat "\nCIRCLE_" (itoa (setq i (1+ i))) " "
(vl-princ-to-string
(mapcar ''((x)(vlax-get o x)) '(Radius Center))
)))
dat))
) ;_ end of foreach
(command "_.U")
(setq fn (strcat (getvar "dwgprefix") "hole dat.csv") f (open fn "w"))
; If you don't want to override file ,to append use (open fn "a") as suggested by Marko @ post#14
(foreach $
(foreach x dat
(setq dat1 (cons (vl-string-translate
" "
","
(vl-list->string
(vl-remove-if ''((a) (or (= a 10) (= a 40) (= a 41))) (vl-string->list x))
) ;_ end of vl-list->string
) ;_ end of vl-string-translate
dat1
) ;_ end of cons
) ;_ end of setq
) ;_ end of foreach
(write-line $ f))
(write-line " " f)
(if f (close f))
(startapp "notepad" fn) ;<--remove this line if you don't want it to pop-up everytime
) ;_ end of progn
) ;_ end of if
(setvar 'cmdecho var)
(princ)
) ;_ end of defun
*可以使用x、y坐标(2D)过滤重叠圆 hanhphuc先生,它将错误显示为“错误:无函数定义:VLAX-ENAME->VLA-OBJECT”。还有一件事我想问你们,你们能给我一个完整的单程序吗,通过它我可以精确地确定两个圆的中心。? 将此添加到顶部
;;;http://www.cadtutor.net/forum/showthread.php?35506-How-to-get-Region-coordinates/page2
;;;adopted as sub-function
(defun LM:reg (reg / RetObj)
(setq Reg (vlax-ename->vla-object reg))
(if (vlax-method-applicable-p reg 'explode)
(progn
(setq RetObj (vlax-safearray->list (vlax-variant-value (vla-explode Reg))))
(repeat (length RetObj)
(if (eq "AcDbRegion" (vla-get-ObjectName (car RetObj)))
(setq RetObj (append RetObj (vlax-safearray->list (vlax-variant-value (vla-explode (car RetObj))))))
(setq RetObj (append RetObj (list (car RetObj))))
) ;_ end of if
(setq RetObj (cdr RetObj))
) ;_ end of repeat
)
)
retobj
) ;_ end of defun
;; Flatten List-Lee Mac
;; Transforms a nested list into a non-nested list
;; http://www.lee-mac.com/flatten.html
(defun LM:flatten ( l )
(if (atom l)
(list l)
(append (LM:flatten (car l)) (if (cdr l) (LM:flatten (cdr l))))
)
)
由于其三维实体,每个位置将有2个圆(上下),z值不同
ie:2 x 2=4个圆形 非常感谢你的帮助。它实际上起作用了。先生,有可能也得到这些圆的半径吗。? 很高兴能提供帮助,这归功于比格尔的想法以及李·麦克的子功能。
是的,可以添加半径
第#6页更新
输出示例,半径为红色:
(vl-load-com)
(defun c:test (/ i e p1 p2 ss lst q)
...
...
...
页:
[1]
2