Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Jin Yong

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

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

Doan Van Ha    2.678

Em viết lisp trong cad 2007, làm sao lấy được mã đối tượng của 1 khối solid

 

An aggregate is a collection of items that are gathered together to form a total quantity

_________________________________

 

free text

charms

 

Chẳng hạn dùng:

(entget (car (entsel "\nChon Solid: ")))

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
phamthanhbinh    3.123

Hehe ko hiểu ý bác Bình lắm nhưng sao lại đổi nick nhỉ???

Hề hề hề

À tại vì bác cứ nói chung ..... mà lại không thích detailing discussion lắm.

Hề hề hề,....

 

PS: Đùa trêu bác đấy, chớ giận nghen.....

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
phamthanhbinh    3.123

Em viết lisp trong cad 2007, làm sao lấy được mã đối tượng của 1 khối solid

 

An aggregate is a collection of items that are gathered together to form a total quantity

_________________________________

 

free text

charms

 

Hề hề hề, chả biết bạn định lấy nó làm chi chứ việc lấy thì cứ y chang như lấy của các đối tựọng khác mà thôi. Có điều nó ra cái mã mà đọc xong thì té xỉu mấy tuần vì chả biết dùng thế nào bạn ạ.

Hế hề hề.

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    278

Hề hề hề

À tại vì bác cứ nói chung ..... mà lại không thích detailing discussion lắm.

Hề hề hề,....

 

PS: Đùa trêu bác đấy, chớ giận nghen.....

Hehehe,interface là 1 thứ trừu tượng nên ko detail nó dc bác àh. Nếu giải thích chắc tốn vài trang của CADViet mà kết quả chắc cũng chẳng tới đâu nhất là với chút xíu cái mà bác gọi là học mót của em. Nhưng em cũng có để lại cái detail để bác nào google thì hiểu detail của nó rồi.

Tính em ko hay giận, bác yên tâm hehehe :D

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
anhcos    177

Interface chỉ dùng cho ngôn ngữ lập trình OOP, bản thân nó không có một đoạn code nào.

LISP có kiểu dữ liệu, mệnh lệnh và dòng điều khiển nhưng không có các cấu trúc dữ liệu nên tương lai sẽ khó phát triể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
Doan Van Ha    2.678

Thông thường, để lấy text của dim thường dùng dxf 1 hoặc dxf 42. Nhưng trong trường hợp của file kèm theo thì kết quả không đúng.

Link dưới đây là 1 bản vẽ, trên đó có 2 kiểu dim:

1). Kiểu dim nguyên bản: là kiểu dim từ bản vẽ người khác gởi cho tôi.

2). Kiểu dim copy: được tôi copy từ dim nguyên bản để test thử.

Kết quả:

1). Kiểu nguyên bản: sai (nếu dùng mã 1 hoặc 42)

2). Kiểu copy: đúng (nếu dùng mã 1 hoặc 42)

Vậy ai biết nguyên nhân xin chỉ giùm. Thanks!

http://www.cadviet.c...9_test_dim1.dwg

P/S: kiểm tra một số lisp của vài cao thủ trên CADViet thì cũng thấy vậy. Vậy là sao 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
damvinhduy    3

Có một số lisp khi load vào sử dụng thì báo lỗi: ActiveX Server returned an error: Error loading type library/DLL. Không biết đó là lỗi gì, các bạn nào biết chỉ giúp cách khắc phục. Thanks.

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
Doan Van Ha    2.678

Có một số lisp khi load vào sử dụng thì báo lỗi: ActiveX Server returned an error: Error loading type library/DLL. Không biết đó là lỗi gì, các bạn nào biết chỉ giúp cách khắc phục. Thanks.

 

Trích dẫn:

ActiveX Server returned an error: Invalid index

Chương trình sử dụng hàm Vlax-safearray->list để chuyển 1 Safearray rỗng đến 1 List.

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    278

Thông thường, để lấy text của dim thường dùng dxf 1 hoặc dxf 42. Nhưng trong trường hợp của file kèm theo thì kết quả không đúng.

Link dưới đây là 1 bản vẽ, trên đó có 2 kiểu dim:

1). Kiểu dim nguyên bản: là kiểu dim từ bản vẽ người khác gởi cho tôi.

2). Kiểu dim copy: được tôi copy từ dim nguyên bản để test thử.

Kết quả:

1). Kiểu nguyên bản: sai (nếu dùng mã 1 hoặc 42)

2). Kiểu copy: đúng (nếu dùng mã 1 hoặc 42)

Vậy ai biết nguyên nhân xin chỉ giùm. Thanks!

http://www.cadviet.c...9_test_dim1.dwg

P/S: kiểm tra một số lisp của vài cao thủ trên CADViet thì cũng thấy vậy. Vậy là sao nhỉ?

Chào bạn Doan Van Ha

Mã DXF 42 quy định chiều dài thực của dimension tuy nhiên là optional (có cũng dc, ko có cũng ko sao)

Mã DXF 1 thể hiện text override

Theo như chúng ta đã biết định dạng dwg/dxf ko chỉ có AutoCAD mới tạo ra dc mà có nhiều phần mềm khác có thể tạo ra.

Mình nghĩ bản vẽ bạn nhận dc do 1 phần mềm nào đó tạo ra hoặc 1 version CAD thấp hơn tạo ra nên lệnh dim bỏ qua dxf 42 hoặc nó ghi một giá trị khác vào (-1: có thể là flag chỉ measure text = giá trị thực)

 

Vậy để lấy chính xác Text của dim ta làm thế nào?

mình nghĩ nên viết thêm 1 defun tính toán lại giá trị measure của DIM (suggestion: dxf code 13, 14, 50,...) cho vào các hàm CV luôn cũng dc hehe

 

p/s: Bạn có thể vào đây để tìm hiểu thêm về DXF qua các phiên bản: http://usa.autodesk.com/adsk/servlet/item?siteID=123112&id=12272454&linkID=10809853

  • 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
ketxu    2.652

Cứ động vào nó là nó lại thay đổi nhỉ

Vậy để đề phòng, mỗi ObjDim thì bác : vla-copy => vla-delete

Hoặc bê nguyên cả cụm Dim đi 1 đơn vị rồi lại bê về chỗ 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
Doan Van Ha    2.678

Cứ động vào nó là nó lại thay đổi nhỉ

Vậy để đề phòng, mỗi ObjDim thì bác : vla-copy => vla-delete

Hoặc bê nguyên cả cụm Dim đi 1 đơn vị rồi lại bê về chỗ cũ ^^

 

Thủ thuật thì biết, nhưng không hiểu bản chất thôi. Chắc có thể như Detailing nói, để nghiên cứu và hỏi lại tác giả của bản vẽ xem.

@Detailing: đã làm việc với người cung cấp bản vẽ này. Họ khẳng định: bản vẽ không dùng 1 phần mềm nào khác, chỉ thuần tuý dùng cad.

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    278

 

Thủ thuật thì biết, nhưng không hiểu bản chất thôi. Chắc có thể như Detailing nói, để nghiên cứu và hỏi lại tác giả của bản vẽ xem.

@Detailing: đã làm việc với người cung cấp bản vẽ này. Họ khẳng định: bản vẽ không dùng 1 phần mềm nào khác, chỉ thuần tuý dùng cad.

Như mình đã nói rồi CAD version thấp hơn sẽ bị.

Bạn thử như sau:

tạo bản vẽ mới vẽ 1 cái Dim Save as AutoCAD R14/97LT/98LT Drawing (*.dwg)

tắt bản vẽ đi rồi mở lại sẽ thấy "hiệu quả" ngay :D

Good luck!

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

 

Thủ thuật thì biết, nhưng không hiểu bản chất thôi. Chắc có thể như Detailing nói, để nghiên cứu và hỏi lại tác giả của bản vẽ xem.

@Detailing: đã làm việc với người cung cấp bản vẽ này. Họ khẳng định: bản vẽ không dùng 1 phần mềm nào khác, chỉ thuần tuý dùng cad.

Chào bạn DoanVanHa

 

Bản chất của nó nằm ở Annotative

 

Bạn làm theo cách sau thì dxf 42 của Dim nguyên bản sẽ thấy giá trị :

-> Gõ lệnh Dimstyle -> Chọn Dimstyle cần modify -> ở đây Dimstyle là K_TRU

-> Tab fit -> tick chọn Scale dimmension to Layout -> OK -> Close

 

Cái này có lẽ nguyên nhân mà bạn detailling đã nói đấy

Các bản CAD đời thấp chưa có Annotative nên mới xảy ra chuyện này

Và đương nhiên sau này bạn có tick chọn Scale dimmension to Layout hay Use overall scale of thì giá trị của Dim nằm ở dxf1 hay là dxf42

  • Vote tăng 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
Doan Van Ha    2.678

Có lẽ bản chất đã hiểu và giải pháp cũng đã có. Thank tất cả!

P/S: giải pháp của tôi là như code kèm theo. Các bác xem hay/dỡ chỗ nào để tiếp thu.

(defun GetTxtDim (ent)
(cond
 ((and (= (cdr (assoc 1 (entget ent))) "") (/= (cdr (assoc 42 (entget ent))) -1.0))
  (setq txt (cdr (assoc 42 (entget ent)))))
 ((and (= (cdr (assoc 1 (entget ent))) "") (= (cdr (assoc 42 (entget ent))) -1.0))
  (command "_dimstyle" "apply" ent "")
  (setq txt (cdr (assoc 42 (entget ent)))))
 (T (setq txt (cdr (assoc 1 (entget ent)))))))

  • 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
damvinhduy    3

 

Trích dẫn:

ActiveX Server returned an error: Invalid index

Chương trình sử dụng hàm Vlax-safearray->list để chuyển 1 Safearray rỗng đến 1 List.

Chưa hiểu ý của bác. Bác có thể nói rõ nguyên nhân và cách khắc phục không. Cảm ơn 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
Thaistreetz    515

Có lẽ bản chất đã hiểu và giải pháp cũng đã có. Thank tất cả!

P/S: giải pháp của tôi là như code kèm theo. Các bác xem hay/dỡ chỗ nào để tiếp thu.

Mình đã từng gặp vấn đề này rồi. và mình chỉ cần chỉnh sửa mỗi dxf 1 là ok. vì dim là đối tượng fức nên thêm hàm entupd nữa.

PS: sửa giá trị của dim thì chỉ cần sửa giá trị dxf 1 của đối tượng chính, muốn giữ nguyên giá trị dim thì thêm vào chuỗi sửa 2 ký tự <> làm tiền tố hay hậu tố hay ở giữa chuỗi sửa thì tùy. mã dxf 42 kệ nó. áp dụng với tất cả các loại dim.

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
Doan Van Ha    2.678

Mình đã từng gặp vấn đề này rồi. và mình chỉ cần chỉnh sửa mỗi dxf 1 là ok. vì dim là đối tượng fức nên thêm hàm entupd nữa.

 

Bác có thể nói rõ hơn được không? Tôi nghĩ vấn đề này nhiều người cần, nên nếu có giải pháp tối ưu để dùng thì tuyệ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
Thaistreetz    515

thì nó chỉ đơn giản như vậy thôi mà bác.

(defun c:df (/ en res)

(entmod (subst (cons 1 "chuoi sua <>m") (assoc 1 (setq res (entget (setq en (car(entsel "chon dim"))) '("*")))) res))

(entupd en))

nếu cần chắc ăn thì bác entmod luôn giá trị dxf 1 đối tượng con Mtext của dim (nhưng mình thử bỏ qua bước này vẫn được. nó tự động thay đổi giá trị theo mã dxf 1 của đối tượng chí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
Doan Van Ha    2.678

thì nó chỉ đơn giản như vậy thôi mà bác.

(defun c:df (/ en res)

(entmod (subst (cons 1 "chuoi sua <>m") (assoc 1 (setq res (entget (setq en (car(entsel "chon dim"))) '("*")))) res))

(entupd en))

nếu cần chắc ăn thì bác entmod luôn giá trị dxf 1 đối tượng con Mtext của dim (nhưng mình thử bỏ qua bước này vẫn được. nó tự động thay đổi giá trị theo mã dxf 1 của đối tượng chính)

 

Như vậy, với mỗi một dim thì phải nhập "chuoi sua" vào hay sao 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
ketxu    2.652

Có lẽ bản chất đã hiểu và giải pháp cũng đã có. Thank tất cả!

P/S: giải pháp của tôi là như code kèm theo. Các bác xem hay/dỡ chỗ nào để tiếp thu.

(defun GetTxtDim (ent)
(cond
 ((and (= (cdr (assoc 1 (entget ent))) "") (/= (cdr (assoc 42 (entget ent))) -1.0))
  (setq txt (cdr (assoc 42 (entget ent)))))
 ((and (= (cdr (assoc 1 (entget ent))) "") (= (cdr (assoc 42 (entget ent))) -1.0))
  (command "_dimstyle" "apply" ent "")
  (setq txt (cdr (assoc 42 (entget ent)))))
 (T (setq txt (cdr (assoc 1 (entget ent)))))))

Dở bác ạ...

- Dài + rối (chắc bác chưa viết gọn lại)

- Sử dụng command trong hàm

- Giá trị hàm trả về không cố định TYPE

(defun getTxt(dim / ret)
(setq ret
(vl-princ-to-string
(cond  ((/= ""(setq ret(vla-get-TextOverride dim))) ret)
  (T (vla-update dim)(vla-get-Measurement dim))
)
)
))

  • 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
Thaistreetz    515

sorry bác Hà. Do ko đọc bài gốc của bác nên tưởng bác muốn chỉnh sửa text của Dim.

Còn nếu chỉ để lấy text của dim thì chỉ cần lấy giá trị dxf 1 của thằng Mtext (đối tượng con của dim) rồi bỏ đi 5 ký tự đầu đi là được. sao phải lằng nhằng gì nữa nhỉ? Như mình nói ở trên. giá trị dxf 1 của đối tượng Mtext luôn theo giá trị dxf 1 của dim

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
gia_bach    1.442

Có lẽ bản chất đã hiểu và giải pháp cũng đã có. Thank tất cả!

P/S: giải pháp của tôi là như code kèm theo. Các bác xem hay/dỡ chỗ nào để tiếp thu.

............

Chỉ cần EntMod lại đối tượng là có thể lấy dxf1 và dxf 42.

code : (entmod (entget (car(entsel "Chon d/tuong :"))))

 

hoặc tổng quát hơn cho tập chọn (fix cả lỗi giãn TEXT của quochuyksxd )

(defun C:fix()
 (foreach e (mapcar 'entget (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget )))));(list (cons 0 "DIMENSION,TEXT")))))))
(entmod e)  )  )
  • 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
damvinhduy    3

Có một số lisp khi load vào sử dụng thì báo lỗi: ActiveX Server returned an error: Error loading type library/DLL. Không biết đó là lỗi gì, các bạn nào biết chỉ giúp cách khắc phục. Thanks.

Không ai có thể giúp mình câu hỏi này sao?

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


×