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

XIN GIÚP ĐỠ VỀ LISP

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

Quote

 

(defun c:ANN ()
  (vl-load-com)
  (princ "\n--- Lisp chinh sua Annotation Scale ---")
  (princ "\nNhap lenh: ANN")

  (setq acDoc (vla-get-ActiveDocument (vlax-get-acad-object)))

  ; Lấy Annotation Scale hiện hành từ Document
  (setq curScale (vla-get-ActiveAnnotationScale acDoc))
  
  (setq ss (ssget))

  (if ss
    (progn
      (setq n 0)
      (while (< n (sslength ss))
        (setq ent (ssname ss n))
        (setq obj (vlax-ename->vla-object ent))
        
        ; Kiểm tra nếu đối tượng có khả năng annotation
        (if (vlax-property-available-p obj 'AnnotationScale)
          (progn
            ; Bước 1: Gán Annotation Scale hiện hành vào trước
            (vla-AddScale obj curScale)

            ; Bước 2: Xóa tất cả các annotation scale khác
            (vlax-for scale (vla-GetAnnotationScales obj)
              (if (/= (vla-get-Name scale) (vla-get-Name curScale))
                (vla-DeleteScale obj scale)
              )
            )

            (princ "\nDa cap nhat doi tuong ve Annotation Scale hien hanh.")
          )
        )
        (setq n (1+ n))
      )
      (princ "\nHoan thanh!")
    )
    (princ "\nKhong co doi tuong nao duoc chon.")
  )
  (princ)
)

 

 

KHÔNG BIẾT CÁC BÁC CÒN Ở LẠI DIỄN ĐÀN NÀY KHÔNG, NẾU CÓ BÁC NÀO ĐI QUA THẤY BÀI EM GIÚP EM MỘT TÍ LÀ TẠI SAO ĐOẠN LISP TRÊN EM VIẾT CHẠY LẠI BÁO LỖI "no function definition: VLA-GET-ACTIVEANNOTATIONSCALE" Ạ?

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ìn qua mình đoán là code bằng AI, nói chung code lisp AI (bản free nhé chứ tính phí thì mình chưa dám chắc 100%) tính đến thời điểm hiện tại là 1 điều gì đó khá bất cập.

Tại sao nói bất cập, đấy là khi gặp 1 đề bài tương đối khó hoặc không đại trà trên mạng, AI nó sẽ viết linh tinh theo kiểu tự nghĩ ra những hàm không tồn tại và chưa bao giờ tồn tại trong thư viện lisp. Nó kiểu như bạn giải 1 phương trình khó, dù không hiểu gì nhưng bạn vẫn viết linh tinh cho đỡ trắng giấy, hay kể cả là chèn thêm lời bát hát vào vậy. Thật sự dùng từ bất cập thì hơi nhẹ, đáng ra phải là nực cười, nhảm nhí :)

Đối với mình, khi gặp phải những trường hợp như này, mình sẽ lặng lẽ thoát chatgpt ra chứ không nên mất công cãi nhau với nó làm gì, và chịu khó tìm nguồn trên web thô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
58 phút trước, Duong Nhat Duy đã nói:

Nhìn qua mình đoán là code bằng AI, nói chung code lisp AI (bản free nhé chứ tính phí thì mình chưa dám chắc 100%) tính đến thời điểm hiện tại là 1 điều gì đó khá bất cập.

Tại sao nói bất cập, đấy là khi gặp 1 đề bài tương đối khó hoặc không đại trà trên mạng, AI nó sẽ viết linh tinh theo kiểu tự nghĩ ra những hàm không tồn tại và chưa bao giờ tồn tại trong thư viện lisp. Nó kiểu như bạn giải 1 phương trình khó, dù không hiểu gì nhưng bạn vẫn viết linh tinh cho đỡ trắng giấy, hay kể cả là chèn thêm lời bát hát vào vậy. Thật sự dùng từ bất cập thì hơi nhẹ, đáng ra phải là nực cười, nhảm nhí :)

Đối với mình, khi gặp phải những trường hợp như này, mình sẽ lặng lẽ thoát chatgpt ra chứ không nên mất công cãi nhau với nó làm gì, và chịu khó tìm nguồn trên web thôi !

đúng là như vậy bác ah, bác có biết tại sao code k chạy k ạ?

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
10 phút trước, Jakebob25 đã nói:

đúng là như vậy bác ah, bác có biết tại sao code k chạy k ạ?

Thì như mình bảo rồi đấy, nó viết lời bài hát vào lisp thì làm sao mà chạy được 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
28 phút trước, Duong Nhat Duy đã nói:

Thì như mình bảo rồi đấy, nó viết lời bài hát vào lisp thì làm sao mà chạy được bạn :)

ý là tại sao nó lại báo lỗi đó trong khi mình có khai báo   (vl-load-com) rồi ấy ạ, chứ thật sự thì lisp loại này mình cũng tìm khắp rồi mà không có nên tự mày mò viết 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
22 phút trước, Jakebob25 đã nói:

ý là tại sao nó lại báo lỗi đó trong khi mình có khai báo (vl-load-com) rồi ấy ạ, chứ thật sự thì lisp loại này mình cũng tìm khắp rồi mà không có nên tự mày mò viết thử.

Bạn làm ơn đọc lại cmt đầu tiên giúp mình, mình không viết thừa thiếu cái gì đâu "AI nó sẽ viết linh tinh theo kiểu tự nghĩ ra những hàm không tồn tại và chưa bao giờ tồn tại trong thư viện lisp". Bạn có thể hình dung trong excel, giả sử muốn tính tổng 1 cột, nhưng chỉ tính tổng các số dương, thì AI nó nghĩ ra 1 cái hàm =SUMTONGCACSODUONG(), trong khi excel không hề có hàm này, vậy thì làm sao chương trình nó chạy được. Cụ thể trong code của bạn có rất nhiều hàm không tồn tại: vla-get-ActiveAnnotationScale, vla-AddScale, vla-DeleteScale

  • 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

Ý bạn là muốn giữ lại Annotative hiện hành và xóa hết các tỉ lệ khác? Nếu vậy thì dùng thử cái này nhé. Mình cũng thử tìm và thấy được lisp này.

 

(defun c:ObjectScaleCurOnly (/ ss n scLst OSC:GetScales)
 (print "Select the objects you wish to modify: ")
 (if (or (setq ss (ssget "I")) (setq ss (ssget)))
   (progn
     ;; Define helper function to get scales attached to an entity
     (defun OSC:GetScales (en / ed xn xd cdn cdd asn asd cn cd sn sd cannoscale)
       (setq ed (entget en))
       (if (and
             ;; Get the XDictionary attached to the object
             (setq xn (vl-position '(102 . "{ACAD_XDICTIONARY") ed))
             (setq xn (cdr (nth (1+ xn) ed)))
             (setq xd (entget xn))
             ;; Get the Context Data Management dictionary attached to the XDictionary
             (setq cdn (vl-position '(3 . "AcDbContextDataManager") xd))
             (setq cdn (cdr (nth (1+ cdn) xd)))
             (setq cdd (entget cdn))
             ;; Get the Annotation Scales dictionary attached to the CD
             (setq asn (vl-position '(3 . "ACDB_ANNOTATIONSCALES") cdd))
             (setq asn (cdr (nth (1+ asn) cdd)))
             (setq asd (entget asn))
             ;; Get the 1st scale attached
             (setq cn (assoc 3 asd))
             (setq cn (member cn asd))
           )
         ;; Step through all scales attached
         (while cn
           (if (and (= (caar cn) 350) ;It it's pointing to a scale record
                    ;; Get the record's data
                    (setq cd (entget (cdar cn)))
                    ;; Get the Context data class
                    (setq sn (assoc 340 cd))
                    (setq sd (entget (cdr sn)))
                    (setq sn (assoc 300 sd))
                    ;; Check if the scale is already in the list
                    (not (vl-position (cdr sn) scLst))
               )
             ;; Add it to the list
             (setq scLst (cons (cdr sn) scLst))
           )
           (setq cn (cdr cn))
         )
       )
     )

     ;; Find a list of scales used in selection
     (setq n (sslength ss))
     (while (>= (setq n (1- n)) 0)
       (OSC:GetScales (ssname ss n))
     )

     ;; Add the current scale to the selection
     (setq cannoscale (getvar "CANNOSCALE"))
     (command "._ObjectScale" ss "" "_Add" cannoscale "")

     ;; Remove all other scales attached
     (command "._ObjectScale" ss "" "_Delete")
     (foreach n scLst
       (if (wcmatch (strcase n) (strcat "~" (strcase cannoscale)))
         (command n)
       )
     )
     (command "")
   )
 )

 (princ)
)

  • Like 1
  • 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

Bác Duy có vẻ “căm” AI thế nhỉ, tôi có hỏi AI về vụ này thì AI trả lời:

 

“Lisp này bị lỗi ở chỗ vla-get-ActiveAnnotationScale.

 

Lý do là vì trong AutoCAD Object Model (ActiveX API) không có thuộc tính ActiveAnnotationScale của Document.

 

Cụ thể:

 

vla-get-ActiveDocument → trả về đối tượng Document.

Nhưng đối tượng Document không có property ActiveAnnotationScale.

Thuộc tính ActiveAnnotationScale thực chất nằm trong Database của bản vẽ, chứ không phải Document.

 

Cách đúng:

Bạn phải lấy Database của Document trước, rồi mới lấy ActiveAnnotationScale.”

 

Nó sửa lại :

 

(defun c:ANN ( / acDoc acDb curScale ss n ent obj)
  (vl-load-com)
  (princ "\n--- Lisp chinh sua Annotation Scale ---")
  (princ "\nNhap lenh: ANN")

  ;; Lấy Document hiện tại
  (setq acDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
  ;; Lấy Database của Document
  (setq acDb (vla-get-Database acDoc))
  ;; Lấy Annotation Scale hiện hành từ Database
  (setq curScale (vla-get-ActiveAnnotationScale acDb))

  ;; Chọn đối tượng
  (setq ss (ssget))
  (if ss
    (progn
      (setq n 0)
      (while (< n (sslength ss))
        (setq ent (ssname ss n))
        (setq obj (vlax-ename->vla-object ent))

        ;; Nếu đối tượng có thuộc tính AnnotationScale
        (if (vlax-property-available-p obj 'AnnotationScale)
          (progn
            ;; Gán Annotation Scale hiện hành
            (vla-AddScale obj curScale)
            ;; Xóa các scale khác
            (vlax-for scale (vla-GetAnnotationScales obj)
              (if (/= (vla-get-Name scale) (vla-get-Name curScale))
                (vla-DeleteScale obj scale)
              )
            )
            (princ "\nDa cap nhat doi tuong ve Annotation Scale hien hanh.")
          )
        )
        (setq n (1+ n))
      )
      (princ "\nHoan thanh!")
    )
    (princ "\nKhong co doi tuong nao duoc chon.")
  )
  (princ)
)

 

Sau đó nó còn hỏi:

 

”Bạn có muốn mình kiểm tra thêm các hàm vla-AddScale và vla-DeleteScale (vì cũng có thể sai khi gọi trong một số phiên bản AutoCAD)?”

 

Nhưng tôi ngưng vì không có hứng đi tiếp!

 

AI nó giỏi đấy chứ, bác Tâp vẽ Cad chắc cũng dùng AI đấy thôi.

  • 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

Cũng tùy lĩnh vực mà mấy con chat được huấn luyện đến cấp độ intermediate hay profesional. Kể cả trong 1 môn nào đó, nó cũng có mảng chưa học đến. Và giống như thi trắc nghiệm, gặp tình huống không biết thì nó tick bậy 1 giá trị nào đó mà nó coi là đúng nhất rồi lấy giá trị đó để làm tiếp câu sau . Không vì có 1 câu không làm được mà bỏ cuộc. Buồn cười nhất là câu nó không trả lời được mà bắt nó giải quyết là nó loay hoay một lúc thừa nhận sai  rồi trả lời giống như lúc đầu.

Nếu bạn ở cấp độ Beginer mà nhờ chat giải quyết vấn đề lập trình thì hên xui tùy theo độ hiếm của tình huống câu hỏi  (khác với độ khó theo tư duy của con người). 

Nếu bạn ở cấp độ Intermediate, bạn cũng học được thêm nhiều thứ khi có nó. Và khi gặp nút thắt bạn có thể mày mò để gỡ, nếu không giải quyết được sẽ cảm thấy vừa nhục vừa nhọc khi nhờ nó. 

Nếu bạn ở cấp độ Profesional, nó dùng để code nhanh là chủ yếu.

  • Like 2

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
13 giờ trước, 7o7 đã nói:

Bác Duy có vẻ “căm” AI thế nhỉ, tôi có hỏi AI về vụ này thì AI trả lời:

 

 

vãi, lại đi hỏi AI tiếp

ông Duy kia nói đúng rồi đấy hoàn toàn không có hàm vla-get-ActiveAnnotationScale, vla-AddScale và vla-DeleteScale. nếu có thì chỉ có thể do bạn tự viết ra

trong trường hợp của ông chủ thớt thì nhờ AI là một sai lầm.

  • 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
28 phút trước, dungpham01 đã nói:

vãi, lại đi hỏi AI tiếp

vậy là bạn không biết rồi AI của bác Cường pro lắm. mất nhiều công huấn luyện mới được đấy.

Minh h cũng hay dùng AI để code. Trước tiên cần thảo luận với AI về các vấn đề học thuật đưa ra mô hình phương pháp nghiên cứu đầy đủ cho 1 bài toán sau đó bắt nó code theo. Mượt luôn.

  • 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
Vào lúc 10/9/2025 tại 17:38, Duong Nhat Duy đã nói:

Bạn làm ơn đọc lại cmt đầu tiên giúp mình, mình không viết thừa thiếu cái gì đâu "AI nó sẽ viết linh tinh theo kiểu tự nghĩ ra những hàm không tồn tại và chưa bao giờ tồn tại trong thư viện lisp". Bạn có thể hình dung trong excel, giả sử muốn tính tổng 1 cột, nhưng chỉ tính tổng các số dương, thì AI nó nghĩ ra 1 cái hàm =SUMTONGCACSODUONG(), trong khi excel không hề có hàm này, vậy thì làm sao chương trình nó chạy được. Cụ thể trong code của bạn có rất nhiều hàm không tồn tại: vla-get-ActiveAnnotationScale, vla-AddScale, vla-DeleteScale

vâng bác viết như vậy thì e hiểu rồi ạ, xin cảm ơn bá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
Vào lúc 11/9/2025 tại 20:29, Tap.Ve.Cad đã nói:

Ý bạn là muốn giữ lại Annotative hiện hành và xóa hết các tỉ lệ khác? Nếu vậy thì dùng thử cái này nhé. Mình cũng thử tìm và thấy được lisp này.

 

(defun c:ObjectScaleCurOnly (/ ss n scLst OSC:GetScales)
 (print "Select the objects you wish to modify: ")
 (if (or (setq ss (ssget "I")) (setq ss (ssget)))
   (progn
     ;; Define helper function to get scales attached to an entity
     (defun OSC:GetScales (en / ed xn xd cdn cdd asn asd cn cd sn sd cannoscale)
       (setq ed (entget en))
       (if (and
             ;; Get the XDictionary attached to the object
             (setq xn (vl-position '(102 . "{ACAD_XDICTIONARY") ed))
             (setq xn (cdr (nth (1+ xn) ed)))
             (setq xd (entget xn))
             ;; Get the Context Data Management dictionary attached to the XDictionary
             (setq cdn (vl-position '(3 . "AcDbContextDataManager") xd))
             (setq cdn (cdr (nth (1+ cdn) xd)))
             (setq cdd (entget cdn))
             ;; Get the Annotation Scales dictionary attached to the CD
             (setq asn (vl-position '(3 . "ACDB_ANNOTATIONSCALES") cdd))
             (setq asn (cdr (nth (1+ asn) cdd)))
             (setq asd (entget asn))
             ;; Get the 1st scale attached
             (setq cn (assoc 3 asd))
             (setq cn (member cn asd))
           )
         ;; Step through all scales attached
         (while cn
           (if (and (= (caar cn) 350) ;It it's pointing to a scale record
                    ;; Get the record's data
                    (setq cd (entget (cdar cn)))
                    ;; Get the Context data class
                    (setq sn (assoc 340 cd))
                    (setq sd (entget (cdr sn)))
                    (setq sn (assoc 300 sd))
                    ;; Check if the scale is already in the list
                    (not (vl-position (cdr sn) scLst))
               )
             ;; Add it to the list
             (setq scLst (cons (cdr sn) scLst))
           )
           (setq cn (cdr cn))
         )
       )
     )

     ;; Find a list of scales used in selection
     (setq n (sslength ss))
     (while (>= (setq n (1- n)) 0)
       (OSC:GetScales (ssname ss n))
     )

     ;; Add the current scale to the selection
     (setq cannoscale (getvar "CANNOSCALE"))
     (command "._ObjectScale" ss "" "_Add" cannoscale "")

     ;; Remove all other scales attached
     (command "._ObjectScale" ss "" "_Delete")
     (foreach n scLst
       (if (wcmatch (strcase n) (strcat "~" (strcase cannoscale)))
         (command n)
       )
     )
     (command "")
   )
 )

 (princ)
)

đúng mong muốn của em luôn rồi bác ơi, quá tuyệt vời cảm ơn bác, e mò nát cái google mà k có sao bác lại có đc nhỉ @@, nếu bác tự viết thì xin cảm ơn bác nhiều 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
Vào lúc 11/9/2025 tại 21:59, 7o7 đã nói:

Bác Duy có vẻ “căm” AI thế nhỉ, tôi có hỏi AI về vụ này thì AI trả lời:

e cảm ơn bác ạ, nhưng mà nó vẫn không chạ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

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  

×