Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
HUY2K

Chat On AI viết lisp không giới hạn ký tự

Các bài được khuyến nghị

Em có đặt vấn đề viết 1 cái lisp san nền đơn giản thì con AI nó viết dài phết:

Mọi người thử nghiệm thu sản phẩm của nó nhé 
 

;; LISP cho AutoCAD - Được viết bởi CHATON AI
(defun c:KBSN ()
  (command ".layer" "n" "SN_Luoi O Vuong" "c" "8" "SN_Luoi O Vuong" ""
           ".layer" "n" "SN_STT O Luoi" "c" "120" "SN_STT O Luoi" ""
           ".style" "Text" "Arial.ttf" "" "" "" "" "" "")
  (command ".layer" "n" "SN_Vong Tron O Luoi" "c" "1" "SN_Vong Tron O Luoi" ""
           ".layer" "n" "SN_Dien Tich Dap" "c" "210" "SN_Dien Tich Dap" ""
           ".layer" "n" "SN_Cao Do Thiet Ke" "c" "1" "SN_Cao Do Thiet Ke" ""
           ".layer" "n" "SN_Cao Do Trung Binh" "c" "30" "SN_Cao Do Trung Binh" ""
           ".layer" "n" "SN_Cao Do Thi Cong Dao" "c" "4" "SN_Cao Do Thi Cong Dao" ""
           ".layer" "n" "SN_Cao Do Thi Cong Dap" "c" "2" "SN_Cao Do Thi Cong Dap" ""
           ".layer" "n" "SN_Khoi Luong Dap" "c" "42" "SN_Khoi Luong Dap" ""
           ".layer" "n" "SN_Cao Do Tu Nhien" "c" "3" "SN_Cao Do Tu Nhien" ""
           ".layer" "n" "SN_Ranh Gioi Dao Dap" "c" "91" "SN_Ranh Gioi Dao Dap" "")
  (princ)
)

; Đánh số thứ tự ô lưới
(defun c:DSTTOL ()
  (setvar "cmdecho" 0)
  (setq SS (ssget '((0 . "text") (8 . "SN_STT O Luoi")))
        LS (sslength SS))
  (setq N 0 M LS)
  (setq CDD (getstring "\nChữ số dùng đầu (tiền tố):"))
  (repeat LS
    (setq MDT (entget (ssname SS N)))
    (setq TEXT1 (assoc 1 MDT))
    (setq STT1 (strcat CDD (rtos M 2 0)))
    (setq STT (subst (cons 1 STT1) TEXT1 MDT))
    (setq N (1+ N) M (1- M))
    (entmod STT)
  )
  (princ)
)

; Thêm dấu trừ "-" vào ô trong ranh giới đào và thêm bất kỳ vào đầu text
(defun c:themtientotext ()
  (setvar "cmdecho" 0)
  (setq SS (ssget '((0 . "text")))
        LS (sslength SS))
  (setq N 0)
  (setq CDD (getstring "\nThêm gì:"))
  (repeat LS
    (setq MDT (entget (ssname SS N)))
    (setq TEXT1 (assoc 1 MDT))
    (setq TEXT2 (cdr TEXT1))
    (setq STT1 (strcat CDD TEXT2))
    (setq STT (subst (cons 1 STT1) TEXT1 MDT))
    (setq N (1+ N))
    (entmod STT)
  )
  (princ)
)

; Vẽ ô lưới sàn nền
(defun c:vol () ; vol: Vẽ ô lưới
  (setvar "cmdecho" 0)
  (setvar "orthomode" 0)
  (setvar "gridmode" 0)
  (setvar "snapmode" 0)
  (setvar "osmode" 0)
  
  ;; Nhận tọa độ điểm từ người dùng
  (setq pt1 (getpoint "\nChọn điểm thứ nhất: ")
        pt2 (getcorner pt1 "\nChọn điểm thứ hai: "))
  (setq ktol (getint "\nKích thước ô lưới: "))
  
  ;; Tạo các điểm mới để vẽ ô lưới
  (setq pt1_x (car pt1)
        pt1_y (cadr pt1)
        pt2_x (car pt2)
        pt2_y (cadr pt2)
        pt3 (polar pt1 0 (- pt2_x pt1_x))
        ln (distance pt3 pt1)
        ld (distance pt2 pt3)
        sln (fix (/ ln ktol))
        sld (fix (/ ld ktol))
        pt4 (polar pt1 0 (* ktol sln))
        pt5 (polar pt4 (/ pi 2) (* ktol sld)))

  ;; Vẽ lưới
  (command ".layer" "s" "SN_Luoi O Vuong" "")
  (command ".line" pt1 pt4 ""
           ".array" "l" "" "r" (+ 1 sld) 1 ktol
           ".line" pt4 pt5 ""
           ".array" "l" "" "r" 1 (+ 1 sln) (- ktol))

  ;; Vẽ các điểm trong ô lưới
  (setq pt6 (polar pt1 (/ pi 2) (* ktol sld))
        pt7 (polar pt6 (/ pi 2) (- (/ ktol 2)))
        pt8 (polar pt7 0 (/ ktol 2)))

  ;; Vẽ các vòng tròn và ghi số thứ tự
  (repeat sld
    ;; Vẽ vòng tròn khối lượng
    (setq bkol (/ ktol 3.00))
    (command ".layer" "s" "SN_Vong Tron O Luoi" "")
    (command ".circle" pt8 bkol 
             ".array" "l" "" "r" 1 sln ktol)

    ;; Ghi số thứ tự ô lưới vào ô lưới
    (setq htext (/ ktol 14.00))
    (setq pt11 (polar pt8 (/ pi 2) (/ ktol 5.33)))
    (command ".layer" "s" "SN_STT O Luoi" "")
    (command ".text" "j" "mc" pt11 htext 0 "STT" 
             ".array" "l" "" "r" 1 sln ktol)

    ;; Vẽ các đoạn thẳng vào ô lưới
    (setq ol_ld (/ ktol (* 2 5.00)) ; đường thẳng đứng
          pt12 (polar pt8 (/ pi 2) ol_ld)
          pt13 (polar pt8 (/ pi 2) (- ol_ld))
          ol_ln (/ ktol (* 2 1.572427175))
          pt14 (polar pt12 0 ol_ln)
          pt15 (polar pt12 0 (- ol_ln))
          pt16 (polar pt13 0 ol_ln)
          pt17 (polar pt13 0 (- ol_ln)))

    (command ".layer" "s" "SN_Vong Tron O Luoi" "")
    (command ".line" pt12 pt13 ""
             ".array" "l" "" "r" 1 sln ktol
             ".line" pt14 pt15 ""
             ".array" "l" "" "r" 1 sln ktol
             ".line" pt16 pt17 ""
             ".array" "l" "" "r" 1 sln ktol)

    ;; Điền diện tích ô lưới
    (setq pt18 (polar pt8 0 (- (/ ktol 6.289703755))))
    (command ".layer" "s" "SN_Dien Tich Dap" "")
    (command ".text" "j" "mc" pt18 htext 0 (rtos (* ktol ktol) 2 0)
             ".array" "l" "" "r" 1 sln ktol)

    ;; Đổi cuối thành đầu
    (setq pt10 (polar pt8 (/ pi 2) (- ktol)))
    (setq pt8 pt10)
  )

  (princ)
)

; Tính cao độ trung bình
(defun c:CDTB ()
  (setvar "cmdecho" 0)
  (setvar "orthomode" 0)
  (setvar "gridmode" 0)
  (setvar "snapmode" 0)
  (setvar "osmode" 0)    
  
  (alert (strcat "Không chọn những ô lưới thuộc ranh giới đào đắp và các ô lẻ"
                  "\nChọn những ô lưới nằm hoàn toàn trong vùng đào hoặc đắp"))
  
  (setq SSC (ssget '((0 . "circle") (8 . "SN_Vong Tron O Luoi")))
        LSC (sslength SSC))  
  (setq N 0)

  (repeat LSC
    ;; Lấy ra mã đối tượng
    (setq MDTC (entget (ssname SSC N))
          pt_tam (cdr (assoc 10 MDTC)) ; lấy ra tọa độ tâm đường tròn
          nol (/ KTOL 2) ; độ lớn nửa ô lưới
          ;; xác định hai điểm bên phải
          pt19 (polar pt_tam 0 nol)
          pt20 (polar pt19 (/ pi 2) (- nol))
          ;; xác định điểm bên phải
          pt21 (polar pt_tam 0 (- (+ nol (* nol 0.8))))
          pt22 (polar pt21 (/ pi 2) (+ nol (* nol 0.8)))
    )

    ;; Tính cao độ trung bình
    (setq CDTB (ssget "w" pt22 pt20 '((0 . "text") (8 . "sn-CDTC*")))
          SL_CDTB (sslength CDTB))

    ;; Cao độ thi công các điểm nút
    (setq CDTC_1 (entget (ssname CDTB 0))
          CDTC_11 (atof (cdr (assoc 1 CDTC_1))))

    (setq CDTC_2 (entget (ssname CDTB 1))
          CDTC_22 (atof (cdr (assoc 1 CDTC_2))))

    (setq CDTC_3 (entget (ssname CDTB 2))
          CDTC_33 (atof (cdr (assoc 1 CDTC_3))))

    (setq CDTC_4 (entget (ssname CDTB 3))
          CDTC_44 (atof (cdr (assoc 1 CDTC_4))))

    ;; Tính ra cao độ trung bình
    (setq CDTBKq (/ (+ CDTC_11 CDTC_22 CDTC_33 CDTC_44) 4)
          CDTBKq (atof (rtos CDTBKq 2 2))
          KLOL (* KTOL KTOL CDTBKq))

    ;; In giá trị
    (setq pt23 (polar pt_tam 0 (/ nol 3.144851877))
          pt24 (polar pt_tam (/ pi 2) (- (/ nol 2.45)))
    )    
    (command ".layer" "s" "SN_Cao Do Trung Binh" ""
             ".text" "j" "mc" pt23 htext 0 (rtos CDTBKq 2 2))

    (if (< CDTBKq 0)
      (progn
        (setq SSdao (ssget "w" pt22 pt20 '((0 . "text") (8 . "SN_Dien Tich Dap")))
              dautru "-" ; thêm dấu "-" vào những diện tích đào
        )
        (setq MDT (entget (ssname SSdao 0)))
        ;; Lấy ra giá trị text thêm dấu trừ
        (setq TEXT1 (assoc 1 MDT))
        (setq TEXT2 (cdr TEXT1))
        (setq STT1 (strcat dautru TEXT2))
        (setq STT (subst (cons 1 STT1) TEXT1 MDT))
        ;; Cập nhật lại mã đối tượng
        (entmod STT)     
        (command ".layer" "s" "SN_Khoi Luong Dao" "")
      )
      (progn    
        (command ".layer" "s" "SN_Khoi Luong Dap" "")
      )
    ) ;; Kết thúc if

    ;; Chuyển sang layer mới nếu CDTBKq <0
    (if (< CDTBKq 0)
      (progn
        (setq SSdao1 (ssget "w" pt22 pt20 '((0 . "text") (8 . "SN_Dien Tich Dap"))))
        (setq layer (entget (ssname SSdao1 0)))
        (setq CLayer (subst '(8 . "SN_Dien Tich Dao") (assoc 8 layer) layer))
        ;; Cập nhật lại mã đối tượng     
        (entmod CLayer)
      )
    )
      
    (command ".text" "j" "mc" pt24 htext 0 (rtos KLOL 2 2))    
    (setq N (1+ N))    
  )
  (princ)    
)

; Tính cao độ thi công
(defun c:CDTC ()
  (setvar "cmdecho" 0)
  (setvar "orthomode" 0)
  (setvar "gridmode" 0)
  (setvar "snapmode" 0)
  (setvar "osmode" 0)    
  
  ;; Kiểm tra bao nhiêu đối tượng có độ tự nhiên
  (setq sum_CDTK (ssget '((0 . "text") (8 . "SN_Cao Do Thiet Ke")))
        SL_CDTK (sslength sum_CDTK))
  (setq N 0)
  
  (repeat SL_CDTK
    (setq MDT_CDTK (entget (ssname sum_CDTK N))
          pt37 (cdr (assoc 10 MDT_CDTK))
          pt38 (polar pt37 0 (- (* ktol 0.3)))
          pt39 (polar pt38 (/ pi 2) (* ktol 0.3))
          pt40 (polar pt37 0 (* ktol 0.3))
          pt41 (polar pt40 (/ pi 2) (- (* ktol 0.3)))
    )
    (setq cdtk_1 (ssget "w" pt39 pt41 '((0 . "text") (8 . "SN_Cao Do Thiet Ke")))
          MDT_cdtk_1 (entget (ssname cdtk_1 0))
          cdtk_2 (atof (cdr (assoc 1 MDT_CDTK)))
    )
    (setq cdtn_1 (ssget "w" pt39 pt41 '((0 . "text") (8 . "SN_Cao Do Tu Nhien")))
          MDT_cdtn_1 (entget (ssname cdtn_1 0))
          cdtn_2 (atof (cdr (assoc 1 MDT_cdtn_1)))
    )
    
    ;; Tính cao độ thi công
    (setq CDTC_1 (- cdtk_2 cdtn_2))
    (setq pt42 (polar pt37 0 (- (* ktol 0.056))))
    
    (if (< CDTC_1 0)
      (progn
        (command ".layer" "s" "SN_Cao Do Thi Cong Dao" "")    
        (command ".text" "j" "r" pt42 htext 0 (rtos CDTC_1 2 2))
      )
      (progn
        (command ".layer" "s" "SN_Cao Do Thi Cong Dap" "")    
        (command ".text" "j" "r" pt42 htext 0 (rtos CDTC_1 2 2))
      )
    )
    
    ;; Tăng số lượng N
    (setq N (1+ N))
  )
  (princ)
)

; Vẽ ranh giới đào đắp
(defun c:rgdd ()
  (setq SSC_rgdd (ssget '((0 . "circle") (8 . "SN_Vong Tron O Luoi")))
        LSC_rgdd (sslength SSC_rgdd))  
  (setq N 0)
  
  (repeat LSC_rgdd
    (command ".layer" "s" "SN_Ranh Gioi Dao Dap" "")
    
    ;; Lấy ra mã đối tượng
    (setq MDT_rgdd (entget (ssname SSC_rgdd N))
          pt_tam_rgdd (cdr (assoc 10 MDT_rgdd)) ; lấy ra tọa độ tâm đường tròn
          nol (/ KTOL 2) ; độ lớn nửa ô lưới
          ;; xác định hai điểm bên phải
          pt19_rgdd (polar pt_tam_rgdd 0 nol)
          pt20_rgdd (polar pt19_rgdd (/ pi 2) (- nol))
          ;; xác định điểm bên phải
          pt21_rgdd (polar pt_tam_rgdd 0 (- (+ nol (* nol 0.8))))
          pt22_rgdd (polar pt21_rgdd (/ pi 2) (+ nol (* nol 0.8)))
    )
    
    ;; Tính cao độ trung bình
    (setq CDTC_dao (ssget "w" pt22_rgdd pt20_rgdd '((0 . "text") (8 . "SN_Cao Do Thi Cong Dao")))
          SL_CDTC_dao (sslength CDTC_dao))
    
    (if (= CDTC_dao nil) 
      (prompt "\nKhông có ranh giới đào đắp")
      (prompt "\nCó ranh giới đào đắp")
    )
    
    ;; Tăng số lượng N
    (setq N (1+ N))
  )
  (princ)
)

; Tính cao độ trung bình ô lưới
(defun c:CDTB ()
  (c:CDTB)
  (setq Timfile (findfile "ve o luoi va tinh gia tri o luoi.LSP"))
  (load Timfile)
  (prompt Timfile)
  (princ)
)

; Cộng trừ cao độ tự nhiên cho 1 hàng số K
(defun c:CSK()
  (setq olddim (getvar "dimzin"))
  (setvar "DimZin" 0)
  (setq en (ssget '((0 . "TEXT"))))
  (setq tp (getint "\n Số chữ số thập phân: "))
  (setq n (sslength en) i 0)
  (if (null newo) (setq newo 1))
  (setq new1 (getreal (strcat "\nNhập số cần cộng <" (rtos newo) ">: ")))
  (if (null new1) (setq new1 newo) (setq newo new1))
  
  (while (< i n)
    (setq ename (entget (ssname en i)))
    (setq li (cdr (assoc 1 ename)))
    (setq lis (+ (atof li) new1))
    (setq ename (subst (cons 1 (rtos lis 2 tp)) (assoc 1 ename) ename))
    (entmod ename)
    (setq i (+ i 1))
  )
  (setvar "dimzin" olddim)
  (princ)
)

; Đưa cao độ của text về đúng trị số của text 
(defun C:HZ( / ss elist ass)
  (if (setq ss (ssget '((0 . "*TEXT"))))
    (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
      (setq elist (entget ent) ass (assoc 10 elist))
      (entmod (subst (cons 10 (list (cadr ass) (caddr ass) (atof (cdr (assoc 1 elist))))) ass elist))
    )
  )
  (princ)
)

; Nối từng cặp text kiểu num gần nhau nhất, bằng dấu ".". VD: nối "5" và "3" thành "5.3".
; Đối tượng chọn và phân nhóm theo height của text.
(defun C:N2T(/ ss lst1 lst2 pt1 pt2 dis ent3)
  (setq ent1 (car (entsel "\nChọn text số lớn làm mẫu: ")) 
        ent2 (car (entsel "\nChọn text số bé làm mẫu: ")))
  (setq lay1 (cdr (assoc 8 (entget ent1))) 
        lay2 (cdr (assoc 8 (entget ent2))))
  
  (princ "\nChọn tập hợp các Text cần nối...")
  (setq ss (ssget (list (cons -4 "<AND") (cons 0 "TEXT") 
                        (cons -4 "<OR") (cons 8 lay1) (cons 8 lay2) 
                        (cons -4 "OR>") (cons -4 "AND>")))) ;; OK
  (setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
  (setq lst (vl-sort lst '(lambda (e1 e2) 
                             (> (cdr (assoc 40 (entget e1))) 
                                (cdr (assoc 40 (entget e2)))))))
  
  (if (/= (rem (length lst) 2) 0)
    (alert "Yêu cầu số lượng 2 nhóm Text phải bằng nhau!")
    (progn
      (setq lst1 (LM:SubList lst 0 (/ (length lst) 2)) 
            lst2 (LM:SubList lst (/ (length lst) 2) (/ (length lst) 2)))
      (foreach ent1 lst1
        (setq pt1 (cdr (assoc 10 (entget ent1))))
        (setq dis (* 2 (distance pt1 (cdr (assoc 10 (entget (nth 0 lst2)))))))
        (foreach ent2 lst2
          (setq pt2 (cdr (assoc 10 (entget ent2))))
          (if (< (distance pt1 pt2) dis)
            (setq dis (distance pt1 pt2) ent3 ent2)))
        (entmod (subst (cons 1 (strcat (cdr (assoc 1 (entget ent1))) "." 
                                        (cdr (assoc 1 (entget ent3))))) 
                       (assoc 1 (entget ent1)) (entget ent1)))
        (entmod (subst (cons 62 1) (assoc 62 (entget ent1)) (entget ent1)))) ;; Thích màu nào thì thay con số 1 (màu đỏ) là được.
      (foreach ent2 lst2
        (entdel ent2))))
  (princ))
  
(defun LM:SubList ( lst start len ) 
  (cond ((null lst) nil) 
        ((< 0 start) (LM:SubList (cdr lst) (1- start) len)) 
        ((null len) lst) 
        ((< 0 len) (cons (car lst) (LM:SubList (cdr lst) start (1- len))))))

; Hàm tạo layer
(defun _layer2 ( name colour )
  (if (null (tblsearch "LAYER" name))
    (entmake
      (list
        '(0 . "LAYER")
        '(100 . "AcDbSymbolTableRecord")
        '(100 . "AcDbLayerTableRecord")
        '(70 . 0)
        (cons 2 name)
        (cons 62 colour)
      )
    )
  )
)

; Hàm tính cao độ theo 2 điểm
(defun c:NS2D(/ chieucao stt item1 temp1 Tdo1 X1 Y1 Z1 Caodo1 item2 Tdo2 X2 Y2 Z2 Caodo2 pt1 pt2 pt3 X3 Y3 Z3 z4 d1 d2 d dh dhz Caodo3) ; chen lien tiep tu 2 diem 
  (or *chieucao* (setq *chieucao* 1))
  (setq chieucao (getreal (strcat "\n Chieu cao text <" (rtos *chieucao* 2 2) "> :")))
  (if (not chieucao) (setq chieucao *chieucao*) (setq *chieucao* chieucao))
  
  (setq stt 1)
  (_layer2 "1-Chen CDTN" 3)
  (setq Olmode (getvar "OSMODE"))
  
  (progn
    (setq item1 (entsel "\nChọn text thứ nhất: "))
    (setq temp1 (entget (car item1)))
    (setq Tdo1 (TD:Text-Base (car item1)))
    (setq Caodo1 (cdr (assoc 1 temp1))
          x1 (car Tdo1)
          y1 (cadr Tdo1)
    )
    (setq pt1 (list x1 y1))
    (setq z1 (atof Caodo1))
    
    (setq item2 (entsel "\nChọn text thứ hai: "))
    (setq temp2 (entget (car item2)))
    (setq Tdo2 (TD:Text-Base (car item2)))
    (setq Caodo2 (cdr (assoc 1 temp2))
          x2 (car Tdo2)
          y2 (cadr Tdo2)
    )
    (setq pt2 (list x2 y2))
    (setq z2 (atof Caodo2))
  )
  
  (while
    (progn
      (setvar "OSMODE" 16383)
      (setq pt3 (getpoint "\nVị trí chèn điểm: "))
      (setq x3 (car pt3))
      (setq y3 (cadr pt3))
      (setq d1 (distance pt1 pt3))
      (setq d2 (distance pt2 pt3))
      (setq d (+ d1 d2))
      (setq dh (- z2 z1))
      (setq dhz (* dh (/ d1 d)))
      (setq z3 (+ z1 dhz))
      (setq z4 0)
      (setq Caodo3 (rtos z3 2 3))
      (setq pt3 (list x3 y3 z4))
      (MakeText pt3 Caodo3 chieucao 0 "C" "1-Chen CDTN")
      (setq stt (+ stt 1))
    )
  )
  (setvar "OSMODE" Olmode)
  (princ)
)

; Hàm nối suy cao độ theo lưới tam giác
(defun c:3df ()
  (setq h (TD:GetXWithDefault getreal "\nNhập chiều cao chữ: " '*h* (atof "1")))
  (setq ss1 (ssget (list (cons 0 "3DFACE"))))
  (setq i 0)
  (setq Ds_3Di (list))
  (setq Ds_3Dpoly (list))
  (setq n (sslength ss1))
  
  (while (< i n)
    (progn
      (setq elst (entget (ssname ss1 i)))
      (setq pt1 (cdr (assoc 10 elst))
            pt3 (cdr (assoc 12 elst))
            pt4 (cdr (assoc 13 elst))
      )
      (setq Ds1 (TDXYZ pt1)
            Ds3 (TDXYZ pt3)
            Ds4 (TDXYZ pt4)
      )
      (setq Ds_3Di (list Ds1 Ds3 Ds4))
    )
    (setq Ds_3Dpoly (append Ds_3Dpoly (list Ds_3Di)))
    (setq i (1+ i))
  )
  
  (while
    (setq Pnt (getpoint "\nChọn điểm cần nội suy: "))
    (progn
      (foreach Ds_3D_i Ds_3Dpoly
        (if (= (PointInTamgiac Pnt Ds_3D_i) "TR")
          (progn
            (setq Pnt_moi (DoCaoDiemNoiSuy Pnt Ds_3D_i))
            (MakeText Pnt_moi (rtos (nth 2 Pnt_moi) 2 3) h 0 "C")                  
          )
        )
      )
    )
  )
  (princ)
)

; Hàm tính cao độ điểm nội suy
(defun DoCaoDiemNoiSuy ( Pnt Ds_3Dface / )
  (setq Pnt_New (list))
  (setq Ds_Pnt (TDXYZ Pnt))
  (progn
    (setq   P1 (nth 0 Ds_3Dface)
            P2 (nth 1 Ds_3Dface)
            P3 (nth 2 Ds_3Dface)
    )
    (setq Ds_D1 (TDXYZ P1)
          Ds_D2 (TDXYZ P2)
          Ds_D3 (TDXYZ P3)
    )
  )
  (progn
    (setq a1 (- (nth 0 Ds_D2) (nth 0 Ds_D1)))
    (setq b1 (- (nth 1 Ds_D2) (nth 1 Ds_D1)))
    (setq c1 (- (nth 2 Ds_D2) (nth 2 Ds_D1)))

    (setq a2 (- (nth 0 Ds_D3) (nth 0 Ds_D1)))
    (setq b2 (- (nth 1 Ds_D3) (nth 1 Ds_D1)))
    (setq c2 (- (nth 2 Ds_D3) (nth 2 Ds_D1)))
    (setq a (/ (- (* b1 c2) (* b2 c1)) (- (* a2 b1) (* a1 b2))))
    (setq b (/ (- (* a2 c1) (* a1 c2)) (- (* a2 b1) (* a1 b2))))
    (setq c (- (nth 2 Ds_D1) (+ (* a (nth 0 Ds_D1)) (* b (nth 1 Ds_D1)))))
  )
  (setq Z (+ (* a (nth 0 Ds_Pnt)) (* b (nth 1 Ds_Pnt)) c))
  (setq Pnt_New (list (nth 0 Ds_Pnt) (nth 1 Ds_Pnt) Z))
  Pnt_New     
)

; Hàm lấy tọa độ điểm
(defun TDXYZ (Pnt / )
  (setq d_sach (list))
  (setq X (car Pnt))
  (setq Y (cadr Pnt))
  (setq Z (caddr Pnt))
  (setq d_sach (list X Y Z))
  d_sach
)

; Hàm xác định điểm bên trái hay phải đoạn thẳng
(defun CCW  (P1 P2 P / )
  (setq dX  ( - (car P) (car P1))
        dY  ( - (cadr P) (cadr P1))
        dX0 ( - (car P2) (car P1))
        dY0 ( - (cadr P2) (cadr P1))
        d   ( - (* dX dY0) (* dY dX0))
  )
  (if (> d 0)
    (setq CCW1 1)
    (setq CCW1 -1)
  )
  CCW1
)

; Hàm xác định điểm bên trong hay ngoài tam giác
(defun PointInTamgiac (P Ds_3D /)
  (setq P1 (nth 0 Ds_3D)
        P2 (nth 1 Ds_3D)
        P3 (nth 2 Ds_3D)
  )
  (setq C (CCW P2 P3 P))
  (if (and (= (CCW P1 P2 P) C) (= (CCW P3 P1 P) C))
    (setq KQ "TR")
    (setq KQ "NG")
  )
  KQ
)

; Hàm tạo layer
(defun _layer2 ( name colour )
  (if (null (tblsearch "LAYER" name))
    (entmake
      (list
        '(0 . "LAYER")
        '(100 . "AcDbSymbolTableRecord")
        '(100 . "AcDbLayerTableRecord")
        '(70 . 0)
        (cons 2 name)
        (cons 62 colour)
      )
    )
  )
)

; Hàm nối từng cặp text kiểu num gần nhau nhất
(defun C:N2T(/ ss lst1 lst2 pt1 pt2 dis ent3)
  (setq ent1 (car (entsel "\nChọn text số lớn làm mẫu: ")) 
        ent2 (car (entsel "\nChọn text số bé làm mẫu: ")))
  (setq lay1 (cdr (assoc 8 (entget ent1))) 
        lay2 (cdr (assoc 8 (entget ent2))))
  
  (princ "\nChọn tập hợp các Text cần nối...")
  (setq ss (ssget (list (cons -4 "<AND") (cons 0 "TEXT") 
                        (cons -4 "<OR") (cons 8 lay1) (cons 8 lay2) 
                        (cons -4 "OR>") (cons -4 "AND>")))) ;; OK
  (setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
  (setq lst (vl-sort lst '(lambda (e1 e2) 
                             (> (cdr (assoc 40 (entget e1))) 
                                (cdr (assoc 40 (entget e2)))))))
  
  (if (/= (rem (length lst) 2) 0)
    (alert "Yêu cầu số lượng 2 nhóm Text phải bằng nhau!")
    (progn
      (setq lst1 (LM:SubList lst 0 (/ (length lst) 2)) 
            lst2 (LM:SubList lst (/ (length lst) 2) (/ (length lst) 2)))
      (foreach ent1 lst1
        (setq pt1 (cdr (assoc 10 (entget ent1))))
        (setq dis (* 2 (distance pt1 (cdr (assoc 10 (entget (nth 0 lst2)))))))
        (foreach ent2 lst2
          (setq pt2 (cdr (assoc 10 (entget ent2))))
          (if (< (distance pt1 pt2) dis)
            (setq dis (distance pt1 pt2) ent3 ent2)))
        (entmod (subst (cons 1 (strcat (cdr (assoc 1 (entget ent1))) "." 
                                        (cdr (assoc 1 (entget ent3))))) 
                       (assoc 1 (entget ent1)) (entget ent1)))
        (entmod (subst (cons 62 1) (assoc 62 (entget ent1)) (entget ent1)))) ;; Thích màu nào thì thay con số 1 (màu đỏ) là được.
      (foreach ent2 lst2
        (entdel ent2))))
  (princ))

(defun LM:SubList ( lst start len ) 
  (cond ((null lst) nil) 
        ((< 0 start) (LM:SubList (cdr lst) (1- start) len)) 
        ((null len) lst) 
        ((< 0 len) (cons (car lst) (LM:SubList (cdr lst) start (1- len))))))

; Hàm tính cao độ theo 2 điểm
(defun c:NS2D(/ chieucao stt item1 temp1 Tdo1 X1 Y1 Z1 Caodo1 item2 Tdo2 X2 Y2 Z2 Caodo2 pt1 pt2 pt3 X3 Y3 Z3 z4 d1 d2 d dh dhz Caodo3) ; chen lien tiep tu 2 diem 
  (or *chieucao* (setq *chieucao* 1))
  (setq chieucao (getreal (strcat "\n Chieu cao text <" (rtos *chieucao* 2 2) "> :")))
  (if (not chieucao) (setq chieucao *chieucao*) (setq *chieucao* chieucao))
  
  (setq stt 1)


image.thumb.png.4788145030f3c7b5c33a4e7316682bab.png

  • Like 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay
Đăng nhập để thực hiện theo  

×