AutoCAD... AutoLISP... VisualLISP...

  [31] Punkty 3D

index  

  Ciąg dalszy "rozważań" na temat stylu punktu w przestrzeni trójwymiarowej (Zobacz: Styl punktu oraz [7] Punkty). Program LISP-owy zamienia wskazane punkty na bloki. Ogólnie zasada jest prosta: Jest to blok anonimowy składający się z trzech punktów położonych w 3 płaszyznach z tym samym punktem wstawienia. Rozwiązanie ma następujące zalety:
  • Blok anonimowy jest niewidoczny dla polecenia _INSERT (WSTAW)
  • We wszystkich płaszyznach widoczny jest zawsze jako punkt (zgodnie z aktualną wartością PDMODE)
  • Nie musi być skalowany (bo za skalę odpowiada zmienna PDSIZE)
  • Zachowuje tryb lokalizacji "POINT" (dodatkowo tryb "BASE" dla bloku)
Kod programu poniżej:
(defun C:P2I (/ ss l u d i) 
  (if 
    (setq ss (ssget "_:L" '((0 . "POINT")))) 
    (progn 
      (setq l (jk:SSX_SS->List ss) 
            u (progn 
                (entmake 
                 '( (0 . "BLOCK")(100 . "AcDbEntity") 
                    (100 . "AcDbBlockBegin")(2 . "*U") 
                    (8 . "0")(62 . 0)(10 0.0 0.0 0.0) 
                    (70 . 1) 
                  ) 
                ) 
                (foreach % 
                  '( (210 1.0 0.0 0.0)(210 0.0 1.0 0.0) 
                     (210 0.0 0.0 1.0) 
                   ) 
                   (entmake 
                     (append 
                        '( (0 . "POINT")(100 . "AcDbEntity") 
                           (8 . "0")(62 . 0)(100 . "AcDbPoint") 
                           (10 0.0 0.0 0.0) 
                         ) 
                         (list %) 
                     ) 
                   ) 
                 ) 
                 (entmake '((0 . "ENDBLK")(8 . "0"))) 
               ) 
       ) 
       (if u 
         (progn 
           (foreach % l 
             (setq d (entget %) 
                   i (list 
                       (cons 10 (cdr (assoc 10 d))) 
                       (cons 8 (cdr (assoc 8 d))) 
                       (if 
                         (cdr (assoc 62 d)) 
                         (cons 62 (cdr (assoc 62 d))) 
                         (cons 62 0) 
                       ) 
                     ) 
             ) 
             (entmake 
               (append 
                '( (0 . "INSERT")(100 . "AcDbEntity") 
                   (100 . "AcDbBlockReference") 
                ) 
                (list 
                  (cons 2 u)(cons 41 1.0) 
                  (cons 42 1.0)(cons 43 1.0) 
                  (cons 50 0.0) 
                ) 
                i 
              ) 
            ) 
            (entdel %) 
          ) 
        ) 
      ) 
    ) 
  ) 
)
Program wymaga funkcji jk:SSX_SS->List która jest również tutaj [7] Punkty. Przedstawiony tutaj program w skróconej wersji, nie posiada obsługi błędów, nie sprawdza możliwości zmian obiektów, oraz nie ustawia znaczników dla UNDO.
Ilustracje powyżej pokazują widok punktów przed i po zmianie.