﻿;;; ==================================================================
;;;  DHD-IIC-EN.LSP  -  align dimension lines in one pass
;;;  Vien Tin hoc Xay dung (IIC) - Truong Dai hoc Xay dung Ha Noi
;;;  https://iic.huce.edu.vn  -  Tel: 0989 427 809
;;; ------------------------------------------------------------------
;;;  Lenh:
;;;    DHD    chon mot loat kich thuoc, bam MOT diem. Moi duong kich
;;;           thuoc duoc day theo phuong vuong goc voi chinh no cho toi
;;;           khi di qua diem ay. Kich thuoc ngang ve cung mot cao do,
;;;           kich thuoc dung ve cung mot hoanh do, trong CUNG MOT lan.
;;;
;;;  Khac voi DIMSPACE va lua chon aliGn cua lenh DIM co san:
;;;    - khong can mot kich thuoc goc, ban bam thang vi tri muon dong;
;;;    - chon lan ca kich thuoc ngang, dung va xien cung mot luc.
;;;
;;;  Chi dong kich thuoc thang (ngang, dung, xoay goc, theo canh xien).
;;;  Kich thuoc ban kinh, duong kinh, goc, toa do bi bo qua va dem lai.
;;;  Con so do (khoang cach hai diem goc) KHONG doi, chi doi vi tri
;;;  duong kich thuoc va chu.
;;;
;;;  Nap tep: go APPLOAD, chon tep nay, bam Load.
;;;  Tep luu bang ma UTF-8. Sua bang Notepad thi nho luu lai dung UTF-8.
;;; ==================================================================

(vl-load-com)

;;; ------------------------------------------------------------------
;;;  Phan chung - moi ham phu deu mang tien to iic-dhd- de khong de
;;;  len ham cung ten cua tep lisp khac dang nap trong cung ban ve.
;;; ------------------------------------------------------------------

(defun iic-dhd-bang-ten ()
  (princ "\nLISP written by RDSIC - Institute of Information Technology in Civil Engineering")
  (princ "\nwebsite: https://iic.huce.edu.vn")
  (princ "\nTel: 0989 427 809")
  (princ)
)

(defun iic-dhd-tai-lieu () (vla-get-ActiveDocument (vlax-get-acad-object)))

(defun iic-dhd-cong (a b) (mapcar '+ a b))
(defun iic-dhd-tru (a b) (mapcar '- a b))
(defun iic-dhd-nhan (v k) (mapcar '(lambda (x) (* x k)) v))
(defun iic-dhd-cham (a b) (apply '+ (mapcar '* a b)))

;; Goc cua duong kich thuoc. Tra ve nil neu khong phai kich thuoc thang.
;;   kieu 0: kich thuoc ngang / dung / xoay goc -> goc nam o ma 50
;;   kieu 1: kich thuoc theo canh xien          -> goc tu diem 13 toi 14
(defun iic-dhd-goc (d / kieu)
  (setq kieu (logand (cdr (assoc 70 d)) 7))
  (cond
    ((= kieu 0) (cdr (assoc 50 d)))
    ((= kieu 1) (angle (cdr (assoc 13 d)) (cdr (assoc 14 d))))
    (t nil)
  )
)

;; Day duong kich thuoc theo phap tuyen cua no cho toi khi di qua p.
;; Dich ca diem dinh duong kich thuoc (ma 10) lan diem giua chu (ma 11)
;; cung mot vec to, nen chu di theo duong kich thuoc.
(defun iic-dhd-doi (en p / d g n p10 p11 dl)
  (setq d (entget en)
        g (iic-dhd-goc d))
  (if g
    (progn
      (setq n   (list (- (sin g)) (cos g) 0.0)
            p10 (cdr (assoc 10 d))
            p11 (cdr (assoc 11 d))
            dl  (iic-dhd-nhan n (iic-dhd-cham (iic-dhd-tru (list (car p) (cadr p) (caddr p10)) p10) n)))
      (setq d (subst (cons 10 (iic-dhd-cong p10 dl)) (assoc 10 d) d))
      (if p11 (setq d (subst (cons 11 (iic-dhd-cong p11 dl)) (assoc 11 d) d)))
      (entmod d)
      (entupd en)
      T
    )
    nil
  )
)

;;; ------------------------------------------------------------------
;;;  Lenh DHD
;;; ------------------------------------------------------------------

(defun c:DHD (/ *error* ss p i n bo)
  (defun *error* (m)
    (vla-EndUndoMark (iic-dhd-tai-lieu))
    (if (not (wcmatch (strcase m) "*CANCEL*,*QUIT*,*BREAK*"))
      (princ (strcat "\nError: " m))
    )
    (princ)
  )
  (iic-dhd-bang-ten)
  (princ "\nSelect the dimensions to align:")
  (setq ss (ssget '((0 . "DIMENSION"))))
  (if ss
    (progn
      (setq p (getpoint "\nPick the point the dimension lines must pass through: "))
      (if p
        (progn
          (setq p (trans p 1 0))
          (vla-StartUndoMark (iic-dhd-tai-lieu))
          (setq i 0 n 0 bo 0)
          (while (< i (sslength ss))
            (if (iic-dhd-doi (ssname ss i) p)
              (setq n (1+ n))
              (setq bo (1+ bo))
            )
            (setq i (1+ i))
          )
          (vla-EndUndoMark (iic-dhd-tai-lieu))
          (princ (strcat "\nAligned " (itoa n) " dimension(s)."))
          (if (> bo 0)
            (princ (strcat " Skipped " (itoa bo) " that are not linear dimensions."))
          )
        )
      )
    )
    (princ "\nNo dimensions selected.")
  )
  (princ)
)

(princ "\nDHD-IIC-EN loaded: type DHD to align dimensions.")
(iic-dhd-bang-ten)
