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

Lỗi font khi lấy giá trị của attribute trong block bằng lisp

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

Xin chào các anh chị.

Em mới học autolisp, em có tạo cái block chứa attribute ( giá trị attribute thứ 1 là " tầng 1") và em dùng autolisp lấy giá trị attribute đó  để gán vào attribute thứ 2 thì nó ra kết quả là "t?ng 1" ở attribute thứ 2, nó bị lỗi font. Có anh chị nào giúp em sửa lỗi này vớ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

Không phải khác font hay lỗi đâu. Chắc bác đọc text bằng vla/vlax nên không đọc được text unicode thôi. Nếu cad 2022 trở lên thì có thể không bị lỗ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
2 giờ trước, ngokiet đã nói:

Không phải khác font hay lỗi đâu. Chắc bác đọc text bằng vla/vlax nên không đọc được text unicode thôi. Nếu cad 2022 trở lên thì có thể không bị lỗi này

đúng rồi bạn, mình đọc giá trị của attribute bằng autolisp. vậy là không có lisp nào khắc phục được lỗi này sao 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
22 giờ trước, trungkien8338 đã nói:

đúng rồi bạn, mình đọc giá trị của attribute bằng autolisp. vậy là không có lisp nào khắc phục được lỗi này sao bạn.

Autolisp giờ bao gồm thêm visual lisp là các lệnh bắt đầu là vla/vlax. muốn ko lỗi thì thay vì dùng vla-object thì dùng ename để đọc thì không lỗi.

Bác muốn hỏi kỹ thì phải đưa lisp bác lên mới chỉ chỗ sửa dc.

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

Autolisp giờ bao gồm thêm visual lisp là các lệnh bắt đầu là vla/vlax. muốn ko lỗi thì thay vì dùng vla-object thì dùng ename để đọc thì không lỗi.

Bác muốn hỏi kỹ thì phải đưa lisp bác lên mới chỉ chỗ sửa dc.

Hình như Unicode không dễ đọc và ghi như vậy (dòng to đen) á?

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 6/8/2022 tại 11:35, trungkien8338 đã nói:

đúng rồi bạn, mình đọc giá trị của attribute bằng autolisp. vậy là không có lisp nào khắc phục được lỗi này sao bạn.

Gợi ý cho bạn cách lấy thông tin ATT không bị lỗi Unicode

(Entget(vlax-vla-object->ename(car (vlax-invoke (vlax-ename->vla-object (Car(entsel))) 'getattributes))))

 

  • 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
42 phút trước, Doan Nguyen Van đã nói:

Gợi ý cho bạn cách lấy thông tin ATT không bị lỗi Unicode


(Entget(vlax-vla-object->ename(car (vlax-invoke (vlax-ename->vla-object (Car(entsel))) 'getattributes))))

 

Gán vào thì có lỗi không Doan ơ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
5 giờ trước, Doan Van Ha đã nói:

Hình như Unicode không dễ đọc và ghi như vậy (dòng to đen) á?

Dễ mà. Kiểu như bác Doan Nguyan Van cũng được mà dùng entget entnext cũng được. Đây là các lệnh chuẩn lisp mà.

Còn gán lại bằng vla/vlax  thì thoải má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
2 phút trước, ngokiet đã nói:

Dễ mà. Kiểu như bác Doan Nguyan Van cũng được mà dùng entget entnext cũng được. Đây là các lệnh chuẩn lisp mà.

Còn gán lại bằng vla/vlax  thì thoải mái.

Chuẩn đấy anh, đã lấy tiếng việt rồi thì gán lại bằng VLa vô tư 

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 7/8/2022 tại 17:13, Doan Nguyen Van đã nói:

Đây bác xem

Untitled.png

(defun c:hh()
    (setq obj (vlax-ename->vla-object(car (entsel)))) ; đối tượng được chọn là một block có nhiều attribute
     ;lay attribute
    (setq sal (vlax-safearray->list (vlax-variant-value (vla-getattributes obj))))
    (setq i 0)
    (repeat (length sal)
        (princ (vlax-get-property (nth i sal) 'TextString )) ; chỗ này lấy ra phần tiếng việt bị lỗi font
        (princ "\n")
        (setq i (+ 1 i))
    )
    
)

NHỜ CÁC BÁC XEM GIÚP.

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

(defun c:hh()
    (setq obj (vlax-ename->vla-object(car (entsel)))) ; đối tượng được chọn là một block có nhiều attribute
     ;lay attribute
    (setq sal (vlax-safearray->list (vlax-variant-value (vla-getattributes obj))))
    (setq i 0)
    (repeat (length sal)
        (princ (vlax-get-property (nth i sal) 'TextString )) ; chỗ này lấy ra phần tiếng việt bị lỗi font
        (princ "\n")
        (setq i (+ 1 i))
    )
    
)

NHỜ CÁC BÁC XEM GIÚP.

Bác có thể đưa cái block att của bác lên được không, vẫn chưa biết mặt mũi cái block đó như thế nào, font gì...

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

(defun c:hh()
    (setq obj (vlax-ename->vla-object(car (entsel)))) ; đối tượng được chọn là một block có nhiều attribute
     ;lay attribute
    (setq sal (vlax-safearray->list (vlax-variant-value (vla-getattributes obj))))
    (setq i 0)
    (repeat (length sal)
        (princ (vlax-get-property (nth i sal) 'TextString )) ; chỗ này lấy ra phần tiếng việt bị lỗi font
        (princ "\n")
        (setq i (+ 1 i))
    )
    
)

NHỜ CÁC BÁC XEM GIÚP.

ở trên đã bảo chuyển về ename để lấy nội dung text mà 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
10 giờ trước, trungkien8338 đã nói:

(defun c:hh()
    (setq obj (vlax-ename->vla-object(car (entsel)))) ; đối tượng được chọn là một block có nhiều attribute
     ;lay attribute
    (setq sal (vlax-safearray->list (vlax-variant-value (vla-getattributes obj))))
    (setq i 0)
    (repeat (length sal)
        (princ (vlax-get-property (nth i sal) 'TextString )) ; chỗ này lấy ra phần tiếng việt bị lỗi font
        (princ "\n")
        (setq i (+ 1 i))
    )
    
)

NHỜ CÁC BÁC XEM GIÚP.

Như lisp bạn viết thì đổi dòng 

 (princ (vlax-get-property (nth i sal) 'TextString ))

Thành (princ (cdr(assoc 1 (entget(vlax-vla-object->ename (nth i sal))))))

 

 

Còn mỉnh thì viết như vậy

(defun c:hh(/ en eg)
  (setq en (car(entsel)))
  (while (eq (cdr (assoc 0 (setq en (entnext en)
				 eg (entget en))))
	     "ATTRIB")
    (princ (strcat (cdr (assoc 1 eg)) "\n")))
  (princ))

 

  • 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ái việc lấy nội dung attrib như vậy tạm được rồi, vấn đề của thớt còn phải làm là gán nội dung đó cho att khác. Tôi nghĩ nếu dùng font unicode thì phải chuyển qua dạng \U+ thì mới hiển thị đúng, còn không sẽ thành dấu ? các từ tiếng Việt có dấ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
Vào lúc 9/8/2022 tại 18:49, ngokiet đã nói:

Như lisp bạn viết thì đổi dòng 

 (princ (vlax-get-property (nth i sal) 'TextString ))

Thành (princ (cdr(assoc 1 (entget(vlax-vla-object->ename (nth i sal))))))

 

 

Còn mỉnh thì viết như vậy


(defun c:hh(/ en eg)
  (setq en (car(entsel)))
  (while (eq (cdr (assoc 0 (setq en (entnext en)
				 eg (entget en))))
	     "ATTRIB")
    (princ (strcat (cdr (assoc 1 eg)) "\n")))
  (princ))

 

cảm ơn bạn, mình đã làm được rồ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

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

×