Создание контура подрезки для блока

Понадобилось мне тут полностью программно создать контур подрезки для блока. Все, что находил в интернете, касалось модификации или чтения уже готового контура, а создание все время выполнялось командой _.xclip.

Ну, мириться с таким положением дел я не стал, кое-что наваял. Чем и хочу похвастаться / поделиться / опозориться (нужное подчеркнуть) :) .

Предупреждаю сразу – исходника не будет, т.к. код не проверялся во всех возможных случаях. Пока что могу сказать следующее: код работает для блоков в мировой системе координат, повернутых под любым углом и имеющими любые коэффициенты масштабирования по любым осям. Не обрабатывается вариант дуговой подрезки (скажу честно – пока не надо, потому и голову не ломал).

(defun _lispru-block-xclip (ename pt-lst / data dict tempdict templist)
                          ;|
*    Создание контура подрезки для вхождения блока
* На основе кодов, предоставленных в
* http://www.theswamp.org/index.php?topic=25232.msg303688;topicseen#msg303688
* http://www.theswamp.org/index.php?topic=39201.msg444355#msg444355
*    Параметры вызова:
  ename    ename-указатель на вхождения блока.
  pt-lst   список точек, ограничивающих область подрезки. Правила определения -
           как в стандартной команде _.xclip
*    Примеры вызова:
(_lispru-block-xclip
  (car (entsel "\nSelect block : "))
  (mapcar 'cdr (vl-remove-if-not
                 '(lambda(x)
                    (= (car x) 10)
                   )
                 (entget (car (entsel "\nSelect pline : "))))))
|;

          ; Set the xclip boundry
  (if (and (setq data (entget ename))
           (setq dict (if (setq templist (assoc 360 data))
                        (cdr templist)
                        (entmakex '((0 . "DICTIONARY") (100 . "AcDbDictionary")))
                        ) ;_ end of if
                 ) ;_ end of setq
           (setq tempdict
                  (if (setq templist (dictsearch dict "ACAD_FILTER"))
                    (cdr (assoc -1 templist))
                    (dictadd dict "ACAD_FILTER" (entmakex '((0 . "DICTIONARY") (100 . "AcDbDictionary"))))
                    ) ;_ end of if
                 ) ;_ end of setq
           ) ;_ end of and
    (progn
      (entupd ename)
      (dictremove tempdict "SPATIAL")
      (dictadd
        tempdict
        "SPATIAL"
        (entmakex
          (append
            '((0 . "SPATIAL_FILTER")
              (100 . "AcDbFilter")
              (100 . "AcDbSpatialFilter")
              )
            (list (cons 70 (length pt-lst)))
            (mapcar
              (function
                (lambda (x)
                  (cons 10 x)
                  ) ;_ end of LAMBDA
                ) ;_ end of FUNCTION
              pt-lst
              ) ;_ end of mapcar
            (list (assoc 210 (entget ename)))
            '((11 0.0 0.0 0.0)
              (71 . 1)
              (72 . 0)
              (73 . 0)
              )
            (mapcar
              (function
                (lambda (x)
                  (cons 40 x)
                  ) ;_ end of lambda
                ) ;_ end of function
              (apply (function append)
                     ((lambda (a p x y z)
                        (list
                          (mapcar '(lambda (_x) (/ _x x))
                                  (list (cos a) (- (sin a)) 0. (- 0. (* (car p) (cos a)) (* (cadr p) (- (sin a)))))
                                  ) ;_ end of mapcar
                          (mapcar '(lambda (_y) (/ _y y))
                                  (list (sin a) (cos a) 0. (- 0. (* (car p) (sin a)) (* (cadr p) (cos a))))
                                  ) ;_ end of mapcar
                          (list 0. 0. 1. 0.)
                          '(1. 0. 0. 0.)
                          '(0. 1. 0. 0.)
                          '(0. 0. 1. 0.)
                          ) ;_ end of list
                        ) ;_ end of lambda
                       (- (cdr (assoc 50 (entget ename))))
                       (cdr (assoc 10 (entget ename)))
                       (cdr (assoc 41 (entget ename)))
                       (cdr (assoc 42 (entget ename)))
                       (cdr (assoc 43 (entget ename)))
                       )
                     ) ;_ end of list
              ) ;_ end of mapcar
            ) ;_ end of append
          ) ;_ end of entmakex
        ) ;_ end of dictadd
          ;fltdata))
      (entmod
        (if (setq templist (assoc 360 data))
          (subst (cons 360 dict) templist data)
          (progn
            (setq templist (member (assoc 5 data) (reverse data)))
            (append
              (reverse templist)
              (append
                (list
                  '(102 . "{ACAD_XDICTIONARY")
                  (cons 360 dict)
                  '(102 . "}")
                  ) ;_ end of list
                (member (assoc 5 data) data)
                ) ;_ end of append
              ) ;_ end of append
            ) ;_ end of progn
          ) ;_ end of if
        ) ;_ end of entmod
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun

Если есть идеи, как код усовершенствовать (например, заставить код работать в неактивном документе, или дополнить обработкой дуг) – милости прошу.

Размещено в Код LISP, Функции LISP · Метки: ,



Поделитесь своим мнением


Я не робот.