Chuyển đến nội dung
Diễn đàn CADViet
Jin Yong

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

Một câu hỏi lớn:

Có ai đã từng viết lisp về bài toán Dijkstra chưa? Cho xin?

Tôi đang gặp rắc rối, dù đã viết được, nhưng tốc độ vẫn còn quá chậm.

P/S: nếu bạn đọc câu hỏi mà chưa đụng đến thì cũng xin đừng hỏi ngược lại: "Dijkstra là gì?", bởi giải thích hơi bị dài, mà cụ Gồ thì đã có.

Đồ thị bao nhiêu đỉnh mà chậm hả Doan Van Ha.

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

Đồ thị bao nhiêu đỉnh mà chậm hả Doan Van Ha.

Tầm 2000 đỉnh, chạy mất khoảng 100 giây mỗi lần. Có thể lặp nhiều lần. Đồ thị này có điều kiện ràng buộc phức tạp hơn bài toán Dijkstra mẫu vì nó kèm thêm 2 điều kiện khác:

1). Khi xét đỉnh v kề đỉnh u thì phải xét thêm đỉnh s trước đỉnh u nữa.

2). Mỗi cặp (u v) ngoài việc xét trọng số còn phụ thuộc thêm 1 đ/k ràng buộc khác.

Ngặt là bài toán này nó có quá nhiều đặc thù chuyên môn nên post lên 4R rất khó. Chỉ hy vọng ai đã có lisp về nó thì xin để nghiên cứu thêm về thuật toán làm sao để nhanh nhất có thể.

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

Thực sự bài toán Dijkstra rất mạch lạc, người ta cũng đã có thuật toán mẫu mực.

Nếu 2000 đỉnh mà 100 giây thì hơi lâu. Mình nghĩ Doan Van Ha thử cải tiến thuật toán theo hướng:

1. Nên có một bước tiền xử lý, để biến đồ thị bài toán thành ban đầu một đồ thị mới, trong đó đã bao gồm 2 điều kiện của đồ thị cũ. Để khi chạy sẽ thành thuật toán Dijkstra đơn thuần.

2. Nên sử dụng các lệnh xử lý hàng loạt trong lisp như mapcar, apply. Tránh sử dụng các vòng lặp while, foreach hay repeat.

  • Vote tăng 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

Nhờ bác Hoanh (hoặc ai đó) sửa giúp lisp này giúp với. Hình như thuật toán nó bị tệ chỗ nào đó nên khi đem vào áp dụng cho bài toán cụ thể thì chạy chậm. Trên cơ sở đó tôi sẽ biến tấu cho bài toán của mình.


;;----- Ham de Test voi vi du don gian. 
(defun C:HA( / vcl ee vv sta end )
 (setq vcl 100 vv '(0 1 2 3 4 5) ee (list
 (list (list 0 0 00) (list 0 1 07) (list 0 2 09) (list 0 3 vcl) (list 0 4 vcl) (list 0 5 14))
 (list (list 1 0 07) (list 1 1 00) (list 1 2 10) (list 1 3 15) (list 1 4 vcl) (list 1 5 vcl))
 (list (list 2 0 09) (list 2 1 10) (list 2 2 00) (list 2 3 11) (list 2 4 vcl) (list 2 5 02))
 (list (list 3 0 vcl) (list 3 1 15) (list 3 2 11) (list 3 3 00) (list 3 4 06) (list 3 5 vcl))
 (list (list 4 0 vcl) (list 4 1 vcl) (list 4 2 vcl) (list 4 3 06) (list 4 4 00) (list 4 5 09))
 (list (list 5 0 14) (list 5 1 vcl) (list 5 2 02) (list 5 3 vcl) (list 5 4 09) (list 5 5 00))))
 (setq sta (getint "\nNhap dinh khoi dau: ")) ; VD nhËp sè ®Çu tiªn lµ: 0
 (setq end (getint "\nNhap dinh ket thuc: ")) ; VD nhËp sè cuèi cïng lµ: 4
 (HA sta end vcl ee vv))
;;----- Ham tong quat.
(defun HA(sta end vcl ee vv / Canh Dinh lst lst1 u n i uv sum q1 vet)
 (defun Canh(u v ee) (caddr (nth v (nth u ee))))
 (defun Dinh(x lst) (cdr (assoc x lst)))
 (setq u sta)
 (setq lst (mapcar '(lambda(x) (cons x (if (= x u) 0 vcl))) vv)) ; G¸n gi¸ trÞ ®Ønh khëi ®Çu lµ 0, cßn l¹i lµ vcl. VD: ((0 . 0) (1 . 100) (2 . 100) (3 . 100) (4 . 100) (5 . 100))
 (while (/= u end) ; Co the thay bang "(while vv", neu tim All Path.
  (setq vv (vl-remove u vv) lst1 lst) ; Lo¹i dÇn tõng ®Ønh ®· xÐt khái vv, VD: (0 1 2 3 4 5) -> (1 2 3 4 5)
  (foreach v vv ; DuyÖt qua tõng ®Ønh cña vv.
   (if (< (setq uv (Canh u v ee)) vcl) ; Chi xet neu canh < vcl.
    (if (< (setq sum (+ (Dinh u lst) uv)) (Dinh v lst)) ; So s¸nh ®Ønh ®· cã víi tæng ®Ønh+c¹nh míi.
     (setq lst (subst (cons v sum) (assoc v lst) lst))))) ; Thay tÊt c¶ tæng cña ®Ønh v liÒn kÒ víi u, nÕu nhá h¬n.
  (if (not (equal lst lst1 1E-8)) ; So sanh, neu lst_old va lst_new khac nhau thi moi sort.
   (setq lst (vl-sort lst '(lambda(x y) (< (cdr x) (cdr y)))) ; Sort lst ®Ó s¾p xÕp l¹i vv.
         q1 (mapcar 'car lst)
         vv (vl-sort vv '(lambda(x y) (< (vl-position x q1) (vl-position y q1)))))) ; Sort vv.
  (setq u (car vv)))
 (setq lst (reverse lst)) ; Bat dau cac buoc do tim vet duong dan tu lst.
 (while (/= (caar lst) end)
  (setq lst (cdr lst)))
 (setq vet (list (car lst)))
 (foreach x (cdr lst)
  (if (equal (Canh (car x) (caar vet) ee) (- (cdar vet) (cdr x)) 1E-8)
   (setq vet (cons x vet))))
 vet)
 

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

Khi làm việc với ActiveX các bạn lưạ chọn dùng hàm nào Vlax-get-or-create-object hay Vlax-create-object. Mình chưa thấy Vlax-get-or-create-object khác Vlax-create-object ở chỗ nào cả.

PS: Mình đang nghiên cứu cách kết nối Cad với GE thông qua ActiveX

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

Các bạn cho tôi hỏi về vấn đề này với.

đây là lisp vẽ tatuy mà tôi dùng rất hữu ích

nhưng có 1 điều là khi tôi muồn vẽ taluy có thông số khác với thông số của taluy ban đầu thì tôi lại  ko biết cách thay đổi thông số của taluy

xin hãy giúp tôi.

;; free lisp from cadviet.com
;;; this lisp was downloaded from http://www.cadviet.com/forum/index.php?showtopic=5947&st=20
 
 
;;;;;;;;;vtl;;;;;;;;;;;;;;;;
;Ve ta luy.lenh VTL1
(defun nsl ()
(if (/= scale nil)
    (progn
         (setq thongbao (strcat "Ty le ban ve ?, <1/" (itoa scale) ">:"))
         (if (not (setq scaletmp (getint thongbao)))
            (setq scaletmp scale)
         )
    )
    (progn
         (setq thongbao "Ty le ban ve ? <1/1000>:")
         (if (not (setq scaletmp (getint thongbao)))
             (setq scaletmp 1000)
         )
    )
)
 
(setq scale scaletmp)
 
(setq Defaultdist (* (* scale 2) 0.002))
(if (setq tg (getreal (strcat "\nKhoang cach ky hieu ta luy <" (rtos Defaultdist 2 2) ">:")))
       (setq Defaultdist tg)
)
 
(setq chieutaluy1 1 sodoan 0)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun nsl1 ()
(if (not ktdoantaluy1)
    (setq ktdoantaluy1 250  tg (getreal (strcat "\nChi\U+1EC1u d\U+00E0i \U+0111o\U+1EA1n ng\U+1EAFn<" (rtos ktdoantaluy1 2 2) ">:")))
)
(if tg
    (setq ktdoantaluy1 tg tg nil)
)
(if (not ktdoantaluy2)
    (setq ktdoantaluy2 500 tg (getreal (strcat "\nChi\U+1EC1u d\U+00E0i \U+0111o\U+1EA1n d\U+00E0i<" (rtos ktdoantaluy2 2 2) ">:")))
)
(if tg
    (setq ktdoantaluy2 tg tg nil)
)
(if (not khoangcachtl)
    (setq khoangcachtl 200 tg (getreal (strcat "\Kho\U+1EA3ng c\U+00E1ch gi\U+1EEFa c\U+00E1c \U+0111o\U+1EA1n<" (rtos khoangcachtl 2 2) ">:")))
)
(if tg
    (setq khoangcachtl tg tg nil)
)
(if (not sodoanngan)
    (setq sodoanngan 1 tg (getint (strcat "\nS\U+1ED1 \U+0111o\U+1EA1n ng\U+1EAFn tr\U+00EAn m\U+1ED9t \U+0111o\U+1EA1n d\U+00E0<" (rtos sodoanngan 2 0) ">:")))
)
(if tg
    (setq sodoanngan tg tg nil)
)
 
)
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(Defun PlMake (Plist) ; Create polyline entities
(entmake '((0 . "POLYLINE")))
(setq n (length Plist)
ic 0
)
(while (< ic n)
(entmake (list (cons 0 "VERTEX") (cons 10 (nth ic Plist))))
(setq ic (1+ ic)
)
)
(entmake '((0 . "SEQEND")))
 
)
 
 
;;;----------------------------------------------------------------
(defun ve1doantaluy (p1 p2 / pvt diemcu ktdoantaluy ketthuc)
(setq pvt (+ (angle p1 p2) (* (/ pi 2) chieutaluy)))
;;;;(setq ketthuc 1)
(if (< sodoan sodoanngan)
(progn
(setq ktdoantaluy ktdoantaluy1)
(setq sodoan (1+ sodoan))
)
(progn
(setq ktdoantaluy ktdoantaluy2)
(setq sodoan 0)
)
)
(setq p2 (polar p1 pvt ktdoantaluy))
(plmake (list p1 p2))
(setq dem (1+ dem))
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(Defun xddsd (com epl kc / e0 e p dsd)
(setq e0 (entlast))
(while e0
(setq e e0)
(setq e0 (entnext e0))
)
(command com epl kc)
(setq e (entnext e))
(while e
(setq p (cdr (assoc 10 (entget e))))
(if p
(setq dsd (cons p dsd))
)
(setq e (entnext e))
)
(command "_.Undo" 1)
(setq dsd dsd)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ve ta luy cho 1 doi tuong
(Defun vetaluy (ep / le e ketthuc them dsd thutu)
(setq dem 0)
(setq sodoan 0)
(setq ss (ssadd))
(setq e (entget (car ep)))
(if (or (= (cdr (assoc 0 e)) "LWPOLYLINE")
(= (cdr (assoc 0 e)) "POLYLINE")
(= (cdr (assoc 0 e)) "SPLINE")
(= (cdr (assoc 0 e)) "LINE")
(= (cdr (assoc 0 e)) "ARC")
(= (cdr (assoc 0 e)) "CIRCLE")
)
 
(setq ketthuc 1)
(prompt "\nDoi tuong duoc chon khong hop le")
)
(if ketthuc
(progn
(setq thutu 0)
(setq dsd (xddsd "_.Measure" ep khoangcachtl))
(setq dsd (append dsd (list (vlax-curve-getstartpoint (car ep)))))
(setq p1 (car dsd))
(repeat (1- (length dsd))
(setq thutu (1+ thutu))
(setq p2 (nth thutu dsd))
(ve1doantaluy p1 p2)
(setq p1 p2)
(setq ss (ssadd (entlast) ss))
)
)
)
(setq dem dem)
)
 
;;;==================================================
(Defun C:TL (/ ep chon lai solan chon ss tg)
(vl-load-com)
(setvar "cmdecho" 0)
(setvar "blipmode" 0)
(command "undo" "g")
;;;;(nsl)
 
(setq ep 1)
(while ep
       (setq solan 0  chieutaluy 1)
       (setq ep (entsel "\nCh\U+1ECDn \U+0111\U+1ED1i t\U+01B0\U+1EE3ng v\U+1EBD ta luy..."))
       (if ep
            (progn
                   (nsl1)
                   (setq solan (vetaluy ep))
                   (initget "Undo Change")
                   (while
                            (setq chon (getkword "Undo/Change <enter for exit>: "))
                            (if (= chon "Undo")
                                (command "_.Undo" solan)
                            )
                            (if (= chon "Change")
                                (progn
                                        (nsl1)
                                        (setq chieutaluy -1)
                                        (command "_.Undo" solan)
                                        (setq solan (vetaluy ep))
                                )
                             )
                             (initget "Undo Change")
                    )
                    (setq blname (getstring t "\nNh\U+1EADp t\U+00EAn block m\U+1ED1n t\U+1EA1o: "))
                    (if (/= blname "")
                        (command "block" blname (list 0.0 0.0 0.0) ss "")
                    )
                    (setq ep nil)
             )
         )
)
(command "undo" "e")
(princ)
)

 

;; free lisp from cadviet.com
 
 
;;;;;;;;;vtl;;;;;;;;;;;;;;;;
;Ve ta luy.lenh VTL1
(defun nsl ()
(if (/= scale nil)
    (progn
         (setq thongbao (strcat "Ty le ban ve ?, <1/" (itoa scale) ">:"))
         (if (not (setq scaletmp (getint thongbao)))
            (setq scaletmp scale)
         )
    )
    (progn
         (setq thongbao "Ty le ban ve ? <1/1000>:")
         (if (not (setq scaletmp (getint thongbao)))
             (setq scaletmp 1000)
         )
    )
)
 
(setq scale scaletmp)
 
(setq Defaultdist (* (* scale 2) 0.002))
(if (setq tg (getreal (strcat "\nKhoang cach ky hieu ta luy <" (rtos Defaultdist 2 2) ">:")))
       (setq Defaultdist tg)
)
 
(setq chieutaluy1 1 sodoan 0)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun nsl1 ()
(if (not ktdoantaluy1)
    (setq ktdoantaluy1 250  tg (getreal (strcat "\nChi\U+1EC1u d\U+00E0i \U+0111o\U+1EA1n ng\U+1EAFn<" (rtos ktdoantaluy1 2 2) ">:")))
)
(if tg
    (setq ktdoantaluy1 tg tg nil)
)
(if (not ktdoantaluy2)
    (setq ktdoantaluy2 500 tg (getreal (strcat "\nChi\U+1EC1u d\U+00E0i \U+0111o\U+1EA1n d\U+00E0i<" (rtos ktdoantaluy2 2 2) ">:")))
)
(if tg
    (setq ktdoantaluy2 tg tg nil)
)
(if (not khoangcachtl)
    (setq khoangcachtl 200 tg (getreal (strcat "\Kho\U+1EA3ng c\U+00E1ch gi\U+1EEFa c\U+00E1c \U+0111o\U+1EA1n<" (rtos khoangcachtl 2 2) ">:")))
)
(if tg
    (setq khoangcachtl tg tg nil)
)
(if (not sodoanngan)
    (setq sodoanngan 1 tg (getint (strcat "\nS\U+1ED1 \U+0111o\U+1EA1n ng\U+1EAFn tr\U+00EAn m\U+1ED9t \U+0111o\U+1EA1n d\U+00E0<" (rtos sodoanngan 2 0) ">:")))
)
(if tg
    (setq sodoanngan tg tg nil)
)
 
)
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(Defun PlMake (Plist) ; Create polyline entities
(entmake '((0 . "POLYLINE")))
(setq n (length Plist)
ic 0
)
(while (< ic n)
(entmake (list (cons 0 "VERTEX") (cons 10 (nth ic Plist))))
(setq ic (1+ ic)
)
)
(entmake '((0 . "SEQEND")))
 
)
 
 
;;;----------------------------------------------------------------
(defun ve1doantaluy (p1 p2 / pvt diemcu ktdoantaluy ketthuc)
(setq pvt (+ (angle p1 p2) (* (/ pi 2) chieutaluy)))
;;;;(setq ketthuc 1)
(if (< sodoan sodoanngan)
(progn
(setq ktdoantaluy ktdoantaluy1)
(setq sodoan (1+ sodoan))
)
(progn
(setq ktdoantaluy ktdoantaluy2)
(setq sodoan 0)
)
)
(setq p2 (polar p1 pvt ktdoantaluy))
(plmake (list p1 p2))
(setq dem (1+ dem))
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(Defun xddsd (com epl kc / e0 e p dsd)
(setq e0 (entlast))
(while e0
(setq e e0)
(setq e0 (entnext e0))
)
(command com epl kc)
(setq e (entnext e))
(while e
(setq p (cdr (assoc 10 (entget e))))
(if p
(setq dsd (cons p dsd))
)
(setq e (entnext e))
)
(command "_.Undo" 1)
(setq dsd dsd)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ve ta luy cho 1 doi tuong
(Defun vetaluy (ep / le e ketthuc them dsd thutu)
(setq dem 0)
(setq sodoan 0)
(setq ss (ssadd))
(setq e (entget (car ep)))
(if (or (= (cdr (assoc 0 e)) "LWPOLYLINE")
(= (cdr (assoc 0 e)) "POLYLINE")
(= (cdr (assoc 0 e)) "SPLINE")
(= (cdr (assoc 0 e)) "LINE")
(= (cdr (assoc 0 e)) "ARC")
(= (cdr (assoc 0 e)) "CIRCLE")
)
 
(setq ketthuc 1)
(prompt "\nDoi tuong duoc chon khong hop le")
)
(if ketthuc
(progn
(setq thutu 0)
(setq dsd (xddsd "_.Measure" ep khoangcachtl))
(setq dsd (append dsd (list (vlax-curve-getstartpoint (car ep)))))
(setq p1 (car dsd))
(repeat (1- (length dsd))
(setq thutu (1+ thutu))
(setq p2 (nth thutu dsd))
(ve1doantaluy p1 p2)
(setq p1 p2)
(setq ss (ssadd (entlast) ss))
)
)
)
(setq dem dem)
)
 
;;;==================================================
(Defun C:TL (/ ep chon lai solan chon ss tg)
(vl-load-com)
(setvar "cmdecho" 0)
(setvar "blipmode" 0)
(command "undo" "g")
;;;;(nsl)
 
(setq ep 1)
(while ep
       (setq solan 0  chieutaluy 1)
       (setq ep (entsel "\nCh\U+1ECDn \U+0111\U+1ED1i t\U+01B0\U+1EE3ng v\U+1EBD ta luy..."))
       (if ep
            (progn
                   (nsl1)
                   (setq solan (vetaluy ep))
                   (initget "Undo Change")
                   (while
                            (setq chon (getkword "Undo/Change <enter for exit>: "))
                            (if (= chon "Undo")
                                (command "_.Undo" solan)
                            )
                            (if (= chon "Change")
                                (progn
                                        (nsl1)
                                        (setq chieutaluy -1)
                                        (command "_.Undo" solan)
                                        (setq solan (vetaluy ep))
                                )
                             )
                             (initget "Undo Change")
                    )
                    (setq blname (getstring t "\nNh\U+1EADp t\U+00EAn block m\U+1ED1n t\U+1EA1o: "))
                    (if (/= blname "")
                        (command "block" blname (list 0.0 0.0 0.0) ss "")
                    )
                    (setq ep nil)
             )
         )
)
(command "undo" "e")
(princ)
)
 
;; free lisp from cadviet.com
 
 
;;;;;;;;;vtl;;;;;;;;;;;;;;;;
;Ve ta luy.lenh VTL1
(defun nsl ()
(if (/= scale nil)
    (progn
         (setq thongbao (strcat "Ty le ban ve ?, <1/" (itoa scale) ">:"))
         (if (not (setq scaletmp (getint thongbao)))
            (setq scaletmp scale)
         )
    )
    (progn
         (setq thongbao "Ty le ban ve ? <1/1000>:")
         (if (not (setq scaletmp (getint thongbao)))
             (setq scaletmp 1000)
         )
    )
)
 
(setq scale scaletmp)
 
(setq Defaultdist (* (* scale 2) 0.002))
(if (setq tg (getreal (strcat "\nKhoang cach ky hieu ta luy <" (rtos Defaultdist 2 2) ">:")))
       (setq Defaultdist tg)
)
 
(setq chieutaluy1 1 sodoan 0)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun nsl1 ()
(if (not ktdoantaluy1)
    (setq ktdoantaluy1 250  tg (getreal (strcat "\nChi\U+1EC1u d\U+00E0i \U+0111o\U+1EA1n ng\U+1EAFn<" (rtos ktdoantaluy1 2 2) ">:")))
)
(if tg
    (setq ktdoantaluy1 tg tg nil)
)
(if (not ktdoantaluy2)
    (setq ktdoantaluy2 500 tg (getreal (strcat "\nChi\U+1EC1u d\U+00E0i \U+0111o\U+1EA1n d\U+00E0i<" (rtos ktdoantaluy2 2 2) ">:")))
)
(if tg
    (setq ktdoantaluy2 tg tg nil)
)
(if (not khoangcachtl)
    (setq khoangcachtl 200 tg (getreal (strcat "\Kho\U+1EA3ng c\U+00E1ch gi\U+1EEFa c\U+00E1c \U+0111o\U+1EA1n<" (rtos khoangcachtl 2 2) ">:")))
)
(if tg
    (setq khoangcachtl tg tg nil)
)
(if (not sodoanngan)
    (setq sodoanngan 1 tg (getint (strcat "\nS\U+1ED1 \U+0111o\U+1EA1n ng\U+1EAFn tr\U+00EAn m\U+1ED9t \U+0111o\U+1EA1n d\U+00E0<" (rtos sodoanngan 2 0) ">:")))
)
(if tg
    (setq sodoanngan tg tg nil)
)
 
)
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(Defun PlMake (Plist) ; Create polyline entities
(entmake '((0 . "POLYLINE")))
(setq n (length Plist)
ic 0
)
(while (< ic n)
(entmake (list (cons 0 "VERTEX") (cons 10 (nth ic Plist))))
(setq ic (1+ ic)
)
)
(entmake '((0 . "SEQEND")))
 
)
 
 
;;;----------------------------------------------------------------
(defun ve1doantaluy (p1 p2 / pvt diemcu ktdoantaluy ketthuc)
(setq pvt (+ (angle p1 p2) (* (/ pi 2) chieutaluy)))
;;;;(setq ketthuc 1)
(if (< sodoan sodoanngan)
(progn
(setq ktdoantaluy ktdoantaluy1)
(setq sodoan (1+ sodoan))
)
(progn
(setq ktdoantaluy ktdoantaluy2)
(setq sodoan 0)
)
)
(setq p2 (polar p1 pvt ktdoantaluy))
(plmake (list p1 p2))
(setq dem (1+ dem))
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(Defun xddsd (com epl kc / e0 e p dsd)
(setq e0 (entlast))
(while e0
(setq e e0)
(setq e0 (entnext e0))
)
(command com epl kc)
(setq e (entnext e))
(while e
(setq p (cdr (assoc 10 (entget e))))
(if p
(setq dsd (cons p dsd))
)
(setq e (entnext e))
)
(command "_.Undo" 1)
(setq dsd dsd)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ve ta luy cho 1 doi tuong
(Defun vetaluy (ep / le e ketthuc them dsd thutu)
(setq dem 0)
(setq sodoan 0)
(setq ss (ssadd))
(setq e (entget (car ep)))
(if (or (= (cdr (assoc 0 e)) "LWPOLYLINE")
(= (cdr (assoc 0 e)) "POLYLINE")
(= (cdr (assoc 0 e)) "SPLINE")
(= (cdr (assoc 0 e)) "LINE")
(= (cdr (assoc 0 e)) "ARC")
(= (cdr (assoc 0 e)) "CIRCLE")
)
 
(setq ketthuc 1)
(prompt "\nDoi tuong duoc chon khong hop le")
)
(if ketthuc
(progn
(setq thutu 0)
(setq dsd (xddsd "_.Measure" ep khoangcachtl))
(setq dsd (append dsd (list (vlax-curve-getstartpoint (car ep)))))
(setq p1 (car dsd))
(repeat (1- (length dsd))
(setq thutu (1+ thutu))
(setq p2 (nth thutu dsd))
(ve1doantaluy p1 p2)
(setq p1 p2)
(setq ss (ssadd (entlast) ss))
)
)
)
(setq dem dem)
)
 
;;;==================================================
(Defun C:TL (/ ep chon lai solan chon ss tg)
(vl-load-com)
(setvar "cmdecho" 0)
(setvar "blipmode" 0)
(command "undo" "g")
;;;;(nsl)
 
(setq ep 1)
(while ep
       (setq solan 0  chieutaluy 1)
       (setq ep (entsel "\nCh\U+1ECDn \U+0111\U+1ED1i t\U+01B0\U+1EE3ng v\U+1EBD ta luy..."))
       (if ep
            (progn
                   (nsl1)
                   (setq solan (vetaluy ep))
                   (initget "Undo Change")
                   (while
                            (setq chon (getkword "Undo/Change <enter for exit>: "))
                            (if (= chon "Undo")
                                (command "_.Undo" solan)
                            )
                            (if (= chon "Change")
                                (progn
                                        (nsl1)
                                        (setq chieutaluy -1)
                                        (command "_.Undo" solan)
                                        (setq solan (vetaluy ep))
                                )
                             )
                             (initget "Undo Change")
                    )
                    (setq blname (getstring t "\nNh\U+1EADp t\U+00EAn block m\U+1ED1n t\U+1EA1o: "))
                    (if (/= blname "")
                        (command "block" blname (list 0.0 0.0 0.0) ss "")
                    )
                    (setq ep nil)
             )
         )
)
(command "undo" "e")
(princ)
)

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

1). Image là 1 hình thì kèm gì trong đó không được, cứ gì text?

2). Bạn test lisp viết theo PA1 xem sao. Như tôi đã nói, nó có 1 nhược điểm. Còn PA2 thì đợi tí. Mà nếu bạn OK PA1 thì khỏi viết PA2.

67029_untitled3.png

LSP+DCL:

 http://www.cadviet.com/upfiles/3/67029_ha_1.zip

Bác Hà cho em hỏi tí bây giờ muốn có 5 cột thì làm sao em sửa hoài của Bác để sử dụng mà không được

Cám ơn Bác nhiều

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

Mọi người cho mình hỏi tại sao trong hộp thoại của mình có trường hợp thay vì hiện là 0.7 nó lại hiện là .7.

Có phải có biến hệ thống nào liên quan đến thằng naỳ không ạ

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

Nhờ các bạn giúp mình câu hỏi này: Làm thế nào để kiểm tra 1 tỷ lệ đang được sử dụng trong bản vẽ? Hoặc làm thế nào để lấy được danh sách tỷ lệ (scale_list) đang được sử dụng trong bản vẽ?

 

Để hiểu được định nghĩa "đang được sử dụng" mà mình nêu trong 2 câu hỏi trên bạn hãy gõ lệnh SCALELISTEDIT. Trong danh sách tỷ lệ được liệt kê ở hộp thoại hiện ra bạn sẽ thấy có một số tỷ lệ không được phép delete, do đó là các tỷ lệ đã được các đối tượng trên bản vẽ sử dụng.

Cảm ơn đã quan tâm câu hỏi của mình!

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ự hỏi rồi tự trả lời luôn là sao chị ThuyLinh313 ,.. mà cho e hỏi : một số tỷ lệ không được phép delete, do đó là các tỷ lệ đã được các đối tượng trên bản vẽ sử dụng là sao? sử dụng cho Model hay Layout hả chị???

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

vla-get-UseStandardScale là 1 hàm trong bộ hàm hỗ trợ in ấn, nó không liên quan gì đến annotation scale.

 

Thêm nữa, theo hiểu biết của cháu về Annotation thì hiện tại không có bất kỳ hàm visual lisp nào hỗ trợ dành cho nó. Nguyên nhân do Visual lisp được Autodesk đưa vào cad từ bản 2000. Từ đó đến giờ vẫn vậy, không có bất kỳ bổ sung cập nhật nào. Trong khi đó Annotation chỉ được đưa vào cad từ bản 2008.
Các thông tin về Annotation data được Autodesk xây dựng mới và lưu trong 2 Dictionary: "ACDB_ANNOTATIONSCALES" và "ACAD_SCALELIST" và chỉ cần dùng các hàm Vanilla lisp là có thể can thiệp và chỉnh sửa. Họ làm vậy để đảm bảo cad đời thấp từ 2007 trở xuống vẫn đọc được bản vẽ có sử dụng Annotative object của cad 2008 trở lên.

 

Autodesk đã có cơ chế kiểm tra 1 tỷ lệ có đang được sử dụng hay không để không cho phép xoá thì cháu nghĩ chắc chắn nó phải được lưu ở đâu đó trong Annotation data.

 

@phamhuy1: Câu hỏi mình nêu trong topic "Hỏi về Lisp (thuật toán, ý tưởng, coding,...)" Nên bạn phải hiểu nó là câu hỏi về lisp. Câu hỏi của bạn mình có thể trả lời, nhưng bạn chỉ có thể hiểu nếu bạn có sử dụng Annotative object trong bản vẽ.

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

Thêm nữa, theo hiểu biết của cháu về Annotation thì hiện tại không có bất kỳ hàm visual lisp nào hỗ trợ dành cho nó. Nguyên nhân do Visual lisp được Autodesk đưa vào cad từ bản 2000. Từ đó đến giờ vẫn vậy, không có bất kỳ bổ sung cập nhật nào. Trong khi đó Annotation chỉ được đưa vào cad từ bản 2008.

Các thông tin về Annotation data được Autodesk xây dựng mới và lưu trong 2 Dictionary: "ACDB_ANNOTATIONSCALES" và "ACAD_SCALELIST" và chỉ cần dùng các hàm Vanilla lisp là có thể can thiệp và chỉnh sửa. Họ làm vậy để đảm bảo cad đời thấp từ 2007 trở xuống vẫn đọc được bản vẽ có sử dụng Annotative object của cad 2008 trở lên.

 

Autodesk đã có cơ chế kiểm tra 1 tỷ lệ có đang được sử dụng hay không để không cho phép xoá thì cháu nghĩ chắc chắn nó phải được lưu ở đâu đó trong Annotation data.

Dynamic Block cũng mới được giới thiệu từ CAD 2007 thế mà lisp vẫn xử lý dc đấy :D

Đây là cơ chế mà AutoCAD kiểm tra 1 tỷ lệ (hay layer, text style, .....) có "đang được sử dụng" hay không (See pictures below) còn làm thế nào để lấy được các thông tin đó là phần của bạn :)

Goodluck!

 

0.png

 

Untitled.png

 

2.png

  • Vote tăng 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

Visual lisp can thiệp vào Dynamic block bằng cách lấy hoặc gán giá trị trong bảng properties của đối tượng mà Detailing. Đó là các thuộc tính mới của đối tượng block chứ không phải là 1 dạng đối tượng mới.

bổ sung: Có lẽ bạn biết rằng Visual lisp là thứ ngôn ngữ kiểu nửa lạc nửa mỡ, vừa hỗ trợ lập trình hướng thủ tục, vừa lập trình hướng đối tượng chứ không như Vanilla lisp chỉ lập trình hướng thủ tục. Điều mà mình muốn nói ở đây chính là việc chắn chắn không thể có 1 hàm hướng đối tượng dành cho Annotation scale kiểu như hàm vla-get-UseStandardScale nêu trên. bởi nếu có, nó phải có ngay từ đầu (không thể), hoặc được bổ sung khi Autocad bắt đầu hỗ trợ Annotative object (chưa từng sảy ra)

 

Mình xem các ghi chú của bạn trong hình mà nghĩ hoài không ra chỗ nào là chỗ chỉ ra 1 tỷ lệ đang được sử dụng. Ngoài ra bạn có thể cho mình biết bạn gọi hộp thoại quản lý bảng và từ điển như trên bằng lệnh nào không? hay nó là 1 tiện ích ngoài?

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

ThuyLinh313 xem ở đây có đoạn code xoá hết các annotation scales không được sử dụng được viết bằng C# có giúp được bạn không. Mình không biết C# đâu nha :mellow:

http://through-the-interface.typepad.com/through_the_interface/2008/05/deleting-unused.html

  • Vote tăng 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

chắc đoạn code này giúp được bạn

;http://forums.autodesk.com/t5/Visual-LISP-AutoLISP-and-General/Deleting-making-annotative-scales/td-p/1977793
;; return a list of the annotation scales
;; used in the dwg or nil if none

(defun anno_list ( / ANNOSET ANNOLIST ENT N BLKSET)
	(setq ANNOLIST nil)
	(if (setq ANNOSET (ssget "x" '((-3 ("AcadAnnotative")))))
		(foreach ENT (mapcar 'cadr (ssnamex ANNOSET))
			(foreach N (ent_scales ENT)
				(if (not (member N ANNOLIST))
					(setq ANNOLIST (cons N ANNOLIST))
				)
			)
		)
	)
	(setq ANNOSET nil)
	(while (setq ANNOSET (tblnext "BLOCK" (not ANNOSET)))
		(setq BLKSET (ssget "x" (list (assoc 2 ANNOSET))))
		(while (and BLKSET (> (sslength BLKSET) 0))
			(setq ENT (ssname BLKSET 0))
      	(ssdel ENT BLKSET)
			(foreach N (ent_scales ENT)
   	   	(if (not (member N ANNOLIST))
      	  		(setq ANNOLIST (cons N ANNOLIST))
         	)
	      )
   	)
	)
	ANNOLIST
)

;; return a list of the annotation scales
;; used by an entity EN or nil if none

(defun ENT_SCALES (EN / A)
	(if
		(and
			(setq A (cdr (assoc 360 (entget EN))))
			(setq A (dictsearch A "AcDbContextDataManager"))
			(setq A (dictsearch (cdr (assoc -1 A)) "ACDB_ANNOTATIONSCALES"))
   	)
    	(progn
			(setq A
      		(apply 'append
					(mapcar '(lambda (X) (if (eq (car X) 350) (list (cdr X)))) A)
      		)
     		)  
   		(mapcar '(lambda (X) (cdr (assoc 300 (entget (cdr (assoc 340 (entget X))))))) A)
		)
	)
)

  • Vote tăng 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

Cảm ơn Tien2005!

Có 10 người bán trái cây và 1000 người mua. Để biết 10 người bán đó có ai đã bán quả đào hay chưa thì ta nên hỏi trực tiếp 10 người họ chứ không nên gián tiếp hỏi 1000 người kia xem có ai đã mua đào.

Mình hiểu ý đồ của bạn trong code trên. Nhưng đó là cách làm ngược và chỉ có thể sử dụng khi bản vẽ ít đối tượng được áp dụng tỷ lệ thôi bạn ạ.

 

Mình cũng không biết gì về C# hết á. nhưng mình sẽ thử ngâm cứu nó xem có thu hoạch được gì không :)

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

@Detailing: Sau khi xem xét kỹ hình bạn gửi thì mình nhận ra hình như bạn cũng gợi ý mình theo cách "hỏi 1000 người mua" như mình nêu bên trên. Mình nghĩ Autodesk họ không làm vậy đâu. Bởi dù bản vẽ của mình có lớn cỡ nào thì khi bật hộp thoại scale list edit nó vẫn hiện ra tức thì, không mất công duyệt từng đối tượng trên bản vẽ.  :)

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

Visual lisp can thiệp vào Dynamic block bằng cách lấy hoặc gán giá trị trong bảng properties của đối tượng Không biết bạn get và set các dynamic properties như thế nào? nên ko có ý kiến về vấn đề này

Có lẽ bạn biết rằng Visual lisp là thứ ngôn ngữ kiểu nửa lạc nửa mỡ, vừa hỗ trợ lập trình hướng thủ tục, vừa lập trình hướng đối tượng (OOP) chứ không như Vanilla lisp chỉ lập trình hướng thủ tục. lisp, Visual lisp hay vanilla lisp cái nào cũng hướng thủ tục hết, lập trình OOP là một khái niệm hoàn toàn khác, bạn có thể Google để biết nó khác như thế nào

Điều mà mình muốn nói ở đây chính là việc chắn chắn không thể có 1 hàm hướng đối tượng dành cho Annotation scale kiểu như hàm vla-get-UseStandardScale nêu trên. bởi nếu có, nó phải có ngay từ đầu (không thể), hoặc được bổ sung khi Autocad bắt đầu hỗ trợ Annotative object Có thể nó ko có một hàm trực tiếp như thế nhưng nó sẽ có cách để làm được việc đó chỉ do mình chưa làm được thì ko nên khẳng định là ko thể làm dc (impossible)

 

Mình xem các ghi chú của bạn trong hình mà nghĩ hoài không ra chỗ nào là chỗ chỉ ra 1 tỷ lệ đang được sử dụng. H1: Text "aaa" (sample) có 2 anno 1:1 và 1:4 - H2: ti3 lệ 1:1 chính là A0 trong Dictionary ACAD_SCALELIST có handle là B7 (duy nhất) - H3: trong Model Space chứa Text - Text có extension Dictionary (ACDB_ANNOTATIONSCALE) - Dictionary có 2 giá trị ( gái trị 1 là 1 con trỏ (Hard pointer) chứa địa chỉ của vùng nhớ của đối tượng có Handle là B7 (chính là A0)

Ngoài ra bạn có thể cho mình biết bạn gọi hộp thoại quản lý bảng và từ điển như trên bằng lệnh nào không? hay nó là 1 tiện ích ngoài? Đó là 1 tiện ích bên ngoài có tên là Arx Development tool (ArxDbg)

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

@Detailing: Sau khi xem xét kỹ hình bạn gửi thì mình nhận ra hình như bạn cũng gợi ý mình theo cách "hỏi 1000 người mua" như mình nêu bên trên. Mình nghĩ Autodesk họ không làm vậy đâu. Bởi dù bản vẽ của mình có lớn cỡ nào thì khi bật hộp thoại scale list edit nó vẫn hiện ra tức thì, không mất công duyệt từng đối tượng trên bản vẽ.  :)

cái ví dụ của bạn cũng trừu tượng nhưng nó ko chính xác lắm vì trái đào với người bán ko có mối liên hệ nào cả :) .

Thử nghĩ theo cách này: Ở 1 bản điện có 5 cái phích cắm vào, mỗi cái lại chia ra 1 chùm dây,  bây giờ bạn cần rút 1 cái ra nhưng phải bảo đảm là ko có 1 thiết bị nào bị tắt vậy bạn phải làm sao? :D

Khi bật ra thì nó chỉ cần đọc cái dictionary thôi đâu có gì để mà lâu :D . Nếu ý bạn là sau đó nếu mình delete nhưng nó ko cho thì lại là 1 vấn đề khác.

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

Quote

Mình xem các ghi chú của bạn trong hình mà nghĩ hoài không ra chỗ nào là chỗ chỉ ra 1 tỷ lệ đang được sử dụng. H1: Text "aaa" (sample) có 2 anno 1:1 và 1:4 - H2: ti3 lệ 1:1 chính là A0 trong Dictionary ACAD_SCALELIST có handle là B7 (duy nhất) - H3: trong Model Space chứa Text - Text có extension Dictionary (ACDB_ANNOTATIONSCALE) - Dictionary có 2 giá trị ( gái trị 1 là 1 con trỏ (Hard pointer) chứa địa chỉ của vùng nhớ của đối tượng có Handle là B7 (chính là A0)

Ngoài ra bạn có thể cho mình biết bạn gọi hộp thoại quản lý bảng và từ điển như trên bằng lệnh nào không? hay nó là 1 tiện ích ngoài? Đó là 1 tiện ích bên ngoài có tên là Arx Development tool (ArxDbg)

Như vậy, phải chăng ý của Detailing là chỉ cần truy cập Extension Dictionary của model space là có thể tìm được danh sách tỷ lệ đã sử dụng. Có lẽ mình hiểu nhầm chính là chỗ này. do bản vẽ mẫu của bạn chỉ có 1 đối tượng text nên mình nghĩ đó là Extension Dictionary của đối tượng text đó. Mình sẽ kiểm chứng lại. Cảm ơn bạn!

 

Có vấn đề gì đó mà mình hiểu sai. Đây là đoạn code mình dùng để kiểm tra theo ý trên.

(setq extDic (vla-getextensiondictionary (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))))

(setq contextDT (vla-item extDic "AcDbContextDataManager"))

Chương trình báo lỗi khi thực hiện dòng code thứ 2. Bởi "AcDbContextDataManager" thực sự không có trong extDic của modelspace. Mâu thuẫn với hình 3.

 

PS: Ý định của mình là viết 1 đoạn code tự động purge annotation scale khi người dùng đóng bản vẽ. Khi sự kiện DrawingWillClose sảy ra, đoạn code đó sẽ kiểm tra từng tỷ lệ, nếu tỷ lệ nào đã được ít nhất 1 đối tượng trên bản vẽ sử dụng thì không được xóa. Trong trường hợp này ví dụ của mình sát hơn cái ổ cắm của bạn:

- Người bán đào là người sở hữu mặt hàng mà bất kỳ đối tượng nào cũng có thể mua. => Kiểm tra người mua, sẽ phải kiểm tra tất cả.

- Còn cái ổ cắm của bạn, nó hoặc không liên kết với bất kỳ thiết bị nào, hoặc sẽ liên kết đến cả 1 chùm thiết bị. => kiểm tra thiết bị, chỉ cần kiểm tra 1 thiết bị trong nhóm.

Mình thì chỉ muốn kiểm tra người bán :)

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

:wacko:  :blink: Đọc xong mờ mắt 

 

Như vậy, phải chăng ý của Detailing là chỉ cần truy cập Extension Dictionary của model space là có thể tìm được danh sách tỷ lệ đã sử dụng. Có lẽ mình hiểu nhầm chính là chỗ này. do bản vẽ mẫu của bạn chỉ có 1 đối tượng text nên mình nghĩ đó là Extension Dictionary của đối tượng text đó. Mình sẽ kiểm chứng lại. Cảm ơn bạn!

Có vấn đề gì đó mà mình hiểu sai. Đây là đoạn code mình dùng để kiểm tra theo ý trên.
(setq extDic (vla-getextensiondictionary (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))))
(setq contextDT (vla-item extDic "AcDbContextDataManager"))
Chương trình báo lỗi khi thực hiện dòng code thứ 2. Bởi "AcDbContextDataManager" thực sự không có trong extDic của modelspace. Mâu thuẫn với hình 3.

PS: Ý định của mình là viết 1 đoạn code tự động purge annotation scale khi người dùng đóng bản vẽ. Khi sự kiện DrawingWillClose sảy ra, đoạn code đó sẽ kiểm tra từng tỷ lệ, nếu tỷ lệ nào đã được ít nhất 1 đối tượng trên bản vẽ sử dụng thì không được xóa. Trong trường hợp này ví dụ của mình sát hơn cái ổ cắm của bạn:
- Người bán đào là người sở hữu mặt hàng mà bất kỳ đối tượng nào cũng có thể mua. => Kiểm tra người mua, sẽ phải kiểm tra tất cả.
- Còn cái ổ cắm của bạn, nó hoặc không liên kết với bất kỳ thiết bị nào, hoặc sẽ liên kết đến cả 1 chùm thiết bị. => kiểm tra thiết bị, chỉ cần kiểm tra 1 thiết bị trong nhóm.
Mình thì chỉ muốn kiểm tra người bán :)

:unsure:  :wacko:  :blink:  B)  Đọc xong mờ mắt luôn :D

  1. Dictionary được lưu trong Database của bản vẽ ko phải trong ModelSpace (chỉ là 1 BlockTablecord) nó chứa tất cả scale list được khai báo ko phải đang sử dụng
  2.  AcDbContextDataManager là 1 class được wrap lại cho .NET ko phải cho lisp (dùng ActiveX với các Interface) nên code của bạn bị lỗi
  3. Về cái ví dụ của bạn, giải thích thì dài dòng và nảy sinh ra thêm nhiều vấn đề nữa nên mình gợi ý bạn google  những thứ sau để hiểu sự khác nhau giữa: người bán đưa trái đào (value) cho người mua và phích cắm nối với thiết bị điện để truyền điện (reference,  object reference, pointer point to memory address)  ngoài ra có thể tìm hiểu thêm sự khác nhau như giữa Hard PointerSoft Pointer trong AutoCAD

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

 

:wacko:  :blink: Đọc xong mờ mắt 

 

:unsure:  :wacko:  :blink:  B)  Đọc xong mờ mắt luôn :D

  1. Dictionary được lưu trong Database của bản vẽ ko phải trong ModelSpace (chỉ là 1 BlockTablecord) nó chứa tất cả scale list được khai báo ko phải đang sử dụng
  2.  AcDbContextDataManager là 1 class được wrap lại cho .NET ko phải cho lisp (dùng ActiveX với các Interface) nên code của bạn bị lỗi
  3. Về cái ví dụ của bạn, giải thích thì dài dòng và nảy sinh ra thêm nhiều vấn đề nữa nên mình gợi ý bạn google  những thứ sau để hiểu sự khác nhau giữa: người bán đưa trái đào (value) cho người mua và phích cắm nối với thiết bị điện để truyền điện (reference,  object reference, pointer point to memory address)  ngoài ra có thể tìm hiểu thêm sự khác nhau như giữa Hard PointerSoft Pointer trong AutoCAD

Bài viết của mình bị sao vậy nhỉ?  :wacko: 

1. Mình sẽ tiếp tục nghiên cứu ý này của bạn. Nếu có gì vướng mắc bạn chỉ thêm cho mình nhé.

2. Có gì đó không đúng. Mình vẫn khai thác được thông tin trong "AcDbContextDataManager" với một số trường hợp. như trường hợp sau:

Đây là hàm kiểm tra 1 đói tượng có phải là annotative object hay không

(defun Annotative-p (en /  exd ano)
 (if (= (type en) 'ENAME) (setq obj (vlax-ename->vla-object en)) (setq obj en))
 (and (eq (vla-get-HasExtensionDictionary obj) :vlax-true)
      (setq exd (vla-GetExtensionDictionary obj))
      (not (vl-catch-all-error-p (setq exd (vl-catch-all-apply 'vla-item (list exd "AcDbContextDataManager")))))
      (setq ano (vla-item exd "ACDB_ANNOTATIONSCALES"))
      (not (zerop (vla-get-Count ano)))))

3. Cảm ơn bạn với những gợi ý này.

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

Cho em hỏi 1 chút.

Muốn biến đoạn Code này về dạng (mapcar '(lambda (......thì viết như thế nào các bác nhỉ?

(defun c:77(/ Lts1 Lts2 Lts i)
(setq Lts1 (list))
(setq Lts2 (list))
(setq i 0)
(setq lts (list '(8 9 nil) '(5 8 nil) '(nil 8 4) '(2 3 nil) '(8 nil 2)))
(while (< i (length Lts))
	(setq Lts1 (mapcar '(lambda (x) (if (= x nil) (not x) x)) (nth i lts)))
	(setq Lts2 (append Lts2 (list Lts1)))
	(setq i (1+ i))
)
(princ Lts2)
(princ)
)

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


×