Загрузка данных


;; ============================================================
;; NVK_COORDS.LSP  v3.8
;; ЭТАП 1: только круг + блок + горизонтальный текст
;; Без поиска соседних точек и без расчета Z
;; Кодировка: ANSI (CP1251)
;; Команда: NVKCOORD
;; ============================================================
(vl-load-com)

(setq NVK-LAYER      "НВК_Координаты точек")
(setq NVK-BLOCK-NAME "НВК_Координаты")
(setq NVK-PT-DIAM    0.5)
(setq NVK-TXT-HEIGHT 1.0)
(setq NVK-TXT-OFFSET 0.8)
(setq NVK-TEXT-STYLE "Arial")
(setq NVK-TXT-WIDTH  25.0)

(defun nvk:doc () (vla-get-ActiveDocument (vlax-get-acad-object)))
(defun nvk:ms  () (vla-get-ModelSpace (nvk:doc)))
(defun nvk:wcs (p) (trans p 1 0))
(defun nvk:ucs (p) (trans p 0 1))
(defun nvk:sa3 (p) (vlax-3d-point (list (car p) (cadr p) (if (caddr p) (caddr p) 0.0))))

(defun nvk:rtos2 (v / s)
  (setq s (vl-string-subst "," "." (rtos (abs v) 2 2)))
  (strcat (if (minusp v) "-" "+") s))
(defun nvk:fmt-x (v) (strcat "X= " (nvk:rtos2 v)))
(defun nvk:fmt-y (v) (strcat "Y= " (nvk:rtos2 v)))

(defun nvk:ensure-layer (/ lc lay)
  (setq lc (vla-get-Layers (nvk:doc)))
  (if (tblsearch "LAYER" NVK-LAYER)
    (setq lay (vla-Item lc NVK-LAYER))
    (setq lay (vla-Add lc NVK-LAYER)))
  (if (= (vla-get-Color lay) 7)
    (vla-put-Color lay 1))
  lay)

(defun nvk:ensure-style (/ sc sty)
  (setq sc (vla-get-TextStyles (nvk:doc)))
  (if (tblsearch "STYLE" NVK-TEXT-STYLE)
    (setq sty (vla-Item sc NVK-TEXT-STYLE))
    (setq sty (vla-Add sc NVK-TEXT-STYLE)))
  (vl-catch-all-apply 'vla-put-FontFile (list sty "arial.ttf"))
  sty)

;; ------------------------------------------------------------
;; КРУГ: рисуем в текущей ПСК, но координаты берём из МСК
;; ------------------------------------------------------------
(defun nvk:draw-marker (pwcs / pucs r cx cy da rm i a1 a2)
  (setq pucs (trans pwcs 0 1)
        cx   (car pucs)
        cy   (cadr pucs)
        r    (/ NVK-PT-DIAM 2.0)
        da   (/ (* 2.0 pi) 8.0)
        rm   (* r 0.98)
        i    0)
  (entmake (list '(0 . "CIRCLE")
                 (cons 8 NVK-LAYER)
                 '(62 . 256)
                 '(6 . "BYLAYER")
                 (cons 10 (list cx cy 0.0))
                 (cons 40 r)))
  (repeat 8
    (setq a1 (* i da)
          a2 (* (1+ i) da)
          i  (1+ i))
    (entmake (list '(0 . "SOLID")
                   (cons 8 NVK-LAYER)
                   '(62 . 256)
                   '(6 . "BYLAYER")
                   (cons 10 (list (+ cx (* rm (cos a1))) (+ cy (* rm (sin a1))) 0.0))
                   (cons 11 (list (+ cx (* rm (cos a2))) (+ cy (* rm (sin a2))) 0.0))
                   (cons 12 (list cx cy 0.0))
                   (cons 13 (list cx cy 0.0))))))

;; ------------------------------------------------------------
;; БЛОК: только невидимые атрибуты X_COORD Y_COORD
;; Базовая точка = центр круга
;; ------------------------------------------------------------
(defun nvk:make-block-def (/ ok)
  (setq ok T)
  (if (not (tblsearch "BLOCK" NVK-BLOCK-NAME))
    (progn
      (if (null (entmake (list '(0 . "BLOCK")
                               (cons 2 NVK-BLOCK-NAME)
                               '(70 . 0)
                               '(10 0.0 0.0 0.0))))
        (setq ok nil))
      (if ok
        (foreach tag '("X_COORD" "Y_COORD")
          (if (null
                (entmake
                  (list
                    '(0 . "ATTDEF")
                    (cons 8 NVK-LAYER)
                    '(10 0.0 0.0 0.0)
                    (cons 40 NVK-TXT-HEIGHT)
                    '(1 . "")
                    (cons 3 tag)
                    (cons 2 tag)
                    '(70 . 1)
                    (cons 7 NVK-TEXT-STYLE)
                    '(72 . 0))))
            (setq ok nil)))
      (if ok
        (if (null (entmake '((0 . "ENDBLK"))))
          (setq ok nil)))))
  ok)

(defun nvk:insert-block (pwcs / br)
  (setq br (vl-catch-all-apply
             'vla-InsertBlock
             (list (nvk:ms) (nvk:sa3 pwcs) NVK-BLOCK-NAME 1.0 1.0 1.0 0.0)))
  (if (vl-catch-all-error-p br)
    nil
    (progn
      (vla-put-Layer br NVK-LAYER)
      br)))

(defun nvk:set-att (br tag val)
  (if (and br (= :vlax-true (vla-get-HasAttributes br)))
    (foreach a (vlax-safearray->list (vlax-variant-value (vla-GetAttributes br)))
      (if (= (strcase (vla-get-TagString a)) (strcase tag))
        (vla-put-TextString a val)))))

;; ------------------------------------------------------------
;; ТЕКСТ: отдельный MTEXT, чтобы у него была своя ручка перемещения
;; Создаём через ActiveX в МСК и сразу задаём Rotation=0
;; ------------------------------------------------------------
(defun nvk:mtext-str (x y)
  (strcat (nvk:fmt-x y) "\n" (nvk:fmt-y x)))

(defun nvk:add-mtext (pwcs x y / ins mt)
  (setq ins (list (car pwcs)
                  (+ (cadr pwcs) (/ NVK-PT-DIAM 2.0) NVK-TXT-OFFSET)
                  0.0))
  (setq mt (vl-catch-all-apply
             'vla-AddMText
             (list (nvk:ms) (nvk:sa3 ins) NVK-TXT-WIDTH (nvk:mtext-str x y))))
  (if (vl-catch-all-error-p mt)
    nil
    (progn
      (vla-put-Layer mt NVK-LAYER)
      (vla-put-StyleName mt NVK-TEXT-STYLE)
      (vla-put-Height mt NVK-TXT-HEIGHT)
      (vl-catch-all-apply 'vla-put-Rotation (list mt 0.0))
      (vl-catch-all-apply 'vla-put-AttachmentPoint (list mt 1)) ; верх-лево
      (vl-catch-all-apply 'vla-put-BackgroundFill (list mt :vlax-true))
      mt)))

;; ------------------------------------------------------------
;; КОМАНДА
;; ------------------------------------------------------------
(defun c:NVKCOORD (/ *error* olde p0 pwcs xw yw ok br mt)
  (defun *error* (msg)
    (if olde (setvar 'CMDECHO olde))
    (if (and msg (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")))
      (princ (strcat "\nОшибка: " msg)))
    (princ))
  (setq olde (getvar 'CMDECHO))
  (setvar 'CMDECHO 0)
  (nvk:ensure-layer)
  (nvk:ensure-style)
  (setq ok (nvk:make-block-def))
  (if (not ok)
    (progn
      (princ "\n[НВК] Не удалось создать определение блока.")
      (setvar 'CMDECHO olde)
      (princ))
    (progn
      (setq p0 (getpoint "\nУкажите базовую точку: "))
      (if p0
        (progn
          (setq pwcs (nvk:wcs p0)
                xw   (car pwcs)
                yw   (cadr pwcs))
          (nvk:draw-marker pwcs)
          (setq br (nvk:insert-block pwcs))
          (setq mt (nvk:add-mtext pwcs xw yw))
          (if br
            (progn
              (nvk:set-att br "X_COORD" (nvk:fmt-x yw))
              (nvk:set-att br "Y_COORD" (nvk:fmt-y xw))
              (princ "\n[НВК] Блок создан."))
            (princ "\n[НВК] Блок не создан."))
          (if mt
            (princ "\n[НВК] Текст создан.")
            (princ "\n[НВК] Текст не создан.")))))
      (setvar 'CMDECHO olde)
      (princ))))

(princ "\nНВК_Координаты v3.8 загружена. Команда: NVKCOORD")
(princ)