把上回龙仔贴的3DPOLY 的offset改了一下,
这是原来的:;;Tip1877: 3D_OFFSET.LSP 3D PLINE OFFSET (c) 2003 Silvia Soonets(vl-load-com)
(setq ESTEDIBUJO (vla-get-activedocument (vlax-get-acad-object)))
(setq *MODELSPACE* (vla-get-modelspace ESTEDIBUJO))
(defun C:3D_OFFSET (/ ENAME OBJECTLISTA LISTA1X
N DISTA OBJECT1 ENAME1LAY COL
LTYPE LTS LW LISTAZNVER
)
(setq DISTA (getdist (strcat "\nSpecify offset distance <"
(rtos (getvar "OFFSETDIST") 2 2)
"> :"
)
)
)
(if (not DISTA)
(setq DISTA (getvar "OFFSETDIST"))
)
(setq ENAME (entsel "\nSelect 3dpoly to offset or <exit>: "))
(while ENAME
(setq ENAME(car ENAME)
OBJECT (vlax-ename->vla-object ENAME)
)
(if (= (vlax-get-property OBJECT "ObjectName") "AcDb3dPolyline")
(progn
(setq LAY (vlax-get-property OBJECT "Layer")
LTYPE (vlax-get-property OBJECT "Linetype")
COL (vlax-get-property OBJECT "Color")
LTS (vlax-get-property OBJECT "LinetypeScale")
LW (vlax-get-property OBJECT "Lineweight")
IS_CLOSED (vlax-get-property OBJECT "Closed")
LISTA (vlax-get-property OBJECT "Coordinates")
LISTA (vlax-safearray->list (vlax-variant-value LISTA))
N0
LISTA1 NIL
)
(while (setq X (nth N LISTA))
(setq NVER (/ (length LISTA) 3.00)
LISTA1 (append LISTA1 (list X))
X (nth (1+ N) LISTA)
LISTA1 (append LISTA1 (list X))
LISTAZ (append LISTAZ (list (nth (+ 2 N) LISTA)))
N (+ 3 N)
)
)
(setq PT (getpoint "\nSpecify point on side to offset?: "))
(setq N (1- (length LISTA1))
LISTA1 (vlax-safearray-fill
(vlax-make-safearray vlax-vbdouble (cons 0 N))
LISTA1
)
OBJECT (vla-addlightweightpolyline *MODELSPACE* LISTA1)
ENAME(vlax-vla-object->ename OBJECT)
)
(command "offset" DISTA ENAME PT "")
(setq OBJECT1 (vlax-ename->vla-object (entlast)))
(vlax-put-property OBJECT1 "Closed" IS_CLOSED)
(setq LISTA1 (vlax-safearray->list
(vlax-variant-value
(vlax-get-property OBJECT1 "Coordinates")
)
)
N 0
LISTANIL
)
(entdel ENAME)
(if (= (/ (length LISTA1) 2) NVER)
(progn
(while (setq X (nth N LISTA1))
(setq LISTA (append LISTA (list X))
LISTA (append LISTA (list (nth (1+ N) LISTA1)))
LISTA (append LISTA (list (nth (/ N 2) LISTAZ)))
N (+ 2 N)
)
)
(setq N(1- (length LISTA))
LISTA(vlax-safearray-fill
(vlax-make-safearray vlax-vbdouble (cons 0 N))
LISTA
)
OBJECT (vla-add3dpoly *MODELSPACE* LISTA)
ENAME(vlax-vla-object->ename OBJECT1)
)
(entdel ENAME)
(vlax-put-property OBJECT "Closed" IS_CLOSED)
(vlax-put-property OBJECT "Layer" LAY)
(vlax-put-property OBJECT "Linetype" LTYPE)
(vlax-put-property OBJECT "Color" COL)
(vlax-put-property OBJECT "LinetypeScale" LTS)
(vlax-put-property OBJECT "Lineweight" LW)
)
(prompt
"\nThe number of vertices have to change. Cannot 3d_offset that object"
)
)
)
(prompt "\nCannot 3d_offset that object")
)
(setq ENAME (entsel "\nSelect 3dpoly to offset or <exit>: "))
)
(princ)
)
这是我改过的:改过之后不会应该OFFSET的点变少了而不出错
Tip1877: 3D_OFFSET.LSP 3D PLINE OFFSET (c) 2003 Silvia Soonets;luoyaya重新修改
(vl-load-com)
(setq *VLA-ACDOC* (vla-get-activedocument (vlax-get-acad-object)))
(setq *MODELSPACE* (vla-get-modelspace *VLA-ACDOC*))
(defun pointtolinedist (plin1 plin2 point / xdist ang)
(setq xdist (distance plin1 point))
(setq ang (abs (- (angle plin1 point) (angle plin1 plin2))))
(* (sin ang) xdist)
)
(defun C:3o (/ ENAME OBJECTLISTA LISTA1X
N DISTA OBJECT1 ENAME1LAY COL
LTYPE LTS LW LISTAZNVER
LISTB1 NB
)
(setq DISTA (getdist (strcat "\n输入offset距离<"
(rtos (getvar "OFFSETDIST") 2 2)
">:"
)
)
)
(if (not DISTA)
(setq DISTA (getvar "OFFSETDIST"))
)
(setq ENAME (entsel "\n点取一条3dpoly或<退出>: "))
(while ENAME
(setq ENAME(car ENAME)
OBJECT (vlax-ename->vla-object ENAME)
n nil
lista nil
lista1 nil
listb1 nil
listaz nil
nver nil
)
(if (= (vlax-get-property OBJECT "ObjectName") "AcDb3dPolyline")
(progn
(setq LAY (vlax-get-property OBJECT "Layer")
LTYPE (vlax-get-property OBJECT "Linetype")
COL (vlax-get-property OBJECT "Color")
LTS (vlax-get-property OBJECT "LinetypeScale")
LW (vlax-get-property OBJECT "Lineweight")
IS_CLOSED (vlax-get-property OBJECT "Closed")
LISTA (vlax-get-property OBJECT "Coordinates")
LISTA (vlax-safearray->list (vlax-variant-value LISTA))
N0
LISTA1 NIL
)
(while (setq X (nth N LISTA))
(setq NVER (/ (length LISTA) 3.00)
LISTA1 (append LISTA1 (list X))
X (nth (1+ N) LISTA)
LISTA1 (append LISTA1 (list X))
LISTAZ (append LISTAZ (list (nth (+ 2 N) LISTA)))
N (+ 3 N)
)
)
;修改原变量
(setq LISTB1 LISTA1)
(setq PT (getpoint "\noffset到哪边: "))
(setq N (1- (length LISTA1))
LISTA1 (vlax-safearray-fill
(vlax-make-safearray vlax-vbdouble (cons 0 N))
LISTA1
)
OBJECT (vla-addlightweightpolyline *MODELSPACE* LISTA1)
ENAME(vlax-vla-object->ename OBJECT)
)
(command "offset" DISTA ENAME PT "")
(setq OBJECT1 (vlax-ename->vla-object (entlast)))
(vlax-put-property OBJECT1 "Closed" IS_CLOSED)
(setq LISTA1 (vlax-safearray->list
(vlax-variant-value
(vlax-get-property OBJECT1 "Coordinates")
)
)
N 0
LISTANIL
)
(entdel ENAME)
(if (= (/ (length LISTA1) 2) NVER);比较点个数
(progn
(while (setq X (nth N LISTA1))
(setq LISTA (append LISTA (list X))
LISTA (append LISTA (list (nth (1+ N) LISTA1)))
LISTA (append LISTA (list (nth (/ N 2) LISTAZ)))
N (+ 2 N)
)
)
(setq N(1- (length LISTA))
LISTA(vlax-safearray-fill
(vlax-make-safearray vlax-vbdouble (cons 0 N))
LISTA
)
OBJECT (vla-add3dpoly *MODELSPACE* LISTA)
ENAME(vlax-vla-object->ename OBJECT1)
)
(entdel ENAME)
(vlax-put-property OBJECT "Closed" IS_CLOSED)
(vlax-put-property OBJECT "Layer" LAY)
(vlax-put-property OBJECT "Linetype" LTYPE)
(vlax-put-property OBJECT "Color" COL)
(vlax-put-property OBJECT "LinetypeScale" LTS)
(vlax-put-property OBJECT "Lineweight" LW)
)
;LISTB1为原线点坐标表
;LISTA1为新线点坐标表
;新变量: LISTB1 NB
(progn
(setq LISTA (list (car LISTA1) (cadr LISTA1) (car LISTAZ))
n 2
NB 2
lenb (length LISTB1))
(while (setq X (nth N LISTA1))
(while (and (not (equal(pointtolinedist
(list (nth (- NB 2) LISTB1) (nth (1- NB) LISTB1))
(list (nth NB LISTB1) (nth (1+ NB) LISTB1))
(list x (nth (1+ N) LISTA1))
)
DISTA 1)) (< NB lenb))
(setq NB (+ 2 NB))
)
(if (< NB lenb)
(setq LISTA (append LISTA (list X))
LISTA (append LISTA (list (nth (1+ N) LISTA1)))
LISTA (append LISTA (list (nth (/ NB 2) LISTAZ)))
)
(setq LISTA (append LISTA (list X))
LISTA (append LISTA (list (nth (1+ N) LISTA1)))
LISTA (append LISTA (list (nth (/ N 2) LISTAZ)))
)
)
(setqN (+ 2 N)
NB n)
)
(setq N(1- (length LISTA))
LISTA(vlax-safearray-fill
(vlax-make-safearray vlax-vbdouble (cons 0 N))
LISTA
)
OBJECT (vla-add3dpoly *MODELSPACE* LISTA)
ENAME(vlax-vla-object->ename OBJECT1)
)
(entdel ENAME)
(vlax-put-property OBJECT "Closed" IS_CLOSED)
(vlax-put-property OBJECT "Layer" LAY)
(vlax-put-property OBJECT "Linetype" LTYPE)
(vlax-put-property OBJECT "Color" COL)
(vlax-put-property OBJECT "LinetypeScale" LTS)
(vlax-put-property OBJECT "Lineweight" LW)
)
;(prompt "\n该对象顶点数改变. 不能再offset该对象" )
)
)
(prompt "\n不能offset该对象!")
)
(setq ENAME (entsel "\n点取一条3dpoly或<退出>:"))
)
(princ)
)
运行出错啊,大神
页:
[1]