luoyaya 发表于 2003-12-20 11:05:00

把上回龙仔贴的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)
)

hisum 发表于 2014-5-10 17:38:35

运行出错啊,大神
页: [1]
查看完整版本: 把上回龙仔贴的3DPOLY 的offset改了一下,