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.
Đăng nhập để thực hiện theo  
hhhhgggg

Lisp đổi kiểu nét của Layer bị lỗi trên CAD 2004 với 1 số bản vẽ có định dạng khác !!! Nhờ sửa giúp !

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

hhhhgggg    30

Lisp này chạy tốt trên CAD 2002 và với các bản vẽ có định dạng "Chuẩn". trên 1 số bản vẽ có định dạng "Sai khác" thì nó thông báo dòng lỗi sau:

Specify new linetype scale <2.0000>: 2

Enter property to change [Color/LAyer/LType/ltScale/LWeight/Thickness]:

Mong bác Pro nào sửa giúp em với.

CODE

(defun c:0(/ dt )

(if (tblsearch "layer" "Plinetntn")

(progn

(setq curLay (getvar "clayer"))

(Command "layer" "m" "Plinetntn" "L" "Hidden2" "" "")

;(prompt "\nChon doi tuong: ")

(if (setq dt (ssget "X" (list (cons 8 "Plinetntn"))))

(command "chprop" dt "" "s" "2" "")

;(alert "Khong co doi tuong tren layer Plinetntn !")

)

(setvar "clayer" curLay)

)

(alert "Chua co Layer : Plinetntn !")

)

(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
phamthanhbinh    3.123
Lisp này chạy tốt trên CAD 2002 và với các bản vẽ có định dạng "Chuẩn". trên 1 số bản vẽ có định dạng "Sai khác" thì nó thông báo dòng lỗi sau:

Specify new linetype scale <2.0000>: 2

Enter property to change [Color/LAyer/LType/ltScale/LWeight/Thickness]:

Mong bác Pro nào sửa giúp em với.

 

Chào bạn hhhhgggg,

Mình chưa hiểu được cái định dạng sai khác của bản vẽ mà bạn nói là ý gì?

Lisp này mình đã thử với cad2004 thấy Ok chứ chả thấy lỗi như bạn nói.

 

Nếu theo như bạn nói thì có lẽ do thiếu một cái enter nữa trong hàm (command "chprop" dt "" "s" "2" "") chăng, vì các dòng thông báo bạn thấy chứng tỏ việc thực hiện lệnh chprop chưa hoàn tất. Nếu bạn enter nhát nữa thì sẽ thoát khỏi lệnh này.

Điều này có thể là do bạn đang dùng cad với version cao hơn cad2004. Bạn thử thêm một dấu enter "" nữa vào cuối hàm nói trên xem sao.

Đây là mình đoán vậy căn cứ vào khi thực hiện lệnh trên cad2004 của mình. Nếu không đúng bạn bỏ qua nhé vì mình cũng chỉ mới học lisp thôi.

 

Chúc bạn thành cô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
hhhhgggg    30
Chào bạn hhhhgggg,

Mình chưa hiểu được cái định dạng sai khác của bản vẽ mà bạn nói là ý gì?

Lisp này mình đã thử với cad2004 thấy Ok chứ chả thấy lỗi như bạn nói.

 

Nếu theo như bạn nói thì có lẽ do thiếu một cái enter nữa trong hàm (command "chprop" dt "" "s" "2" "") chăng, vì các dòng thông báo bạn thấy chứng tỏ việc thực hiện lệnh chprop chưa hoàn tất. Nếu bạn enter nhát nữa thì sẽ thoát khỏi lệnh này.

Điều này có thể là do bạn đang dùng cad với version cao hơn cad2004. Bạn thử thêm một dấu enter "" nữa vào cuối hàm nói trên xem sao.

Đây là mình đoán vậy căn cứ vào khi thực hiện lệnh trên cad2004 của mình. Nếu không đúng bạn bỏ qua nhé vì mình cũng chỉ mới học lisp thôi.

 

Chúc bạn thành công.

Mình đã sửa theo bạn, thực ra thì nó vẫn vậy thôi. Khi bản vẽ có dung lượng >2Mb( Nhiều đối tượng ) thì nó báo lỗi như mình nêu và ko chạy, mình thử xoa đi gần hết bản vẽ chỉ để lại ít đối tượng thì nó chạy ngon lành. Đó cũng là 1 nghĩa của cái ý định dạng sai khác của bản vẽ như mình đã nói. Vì nhiều Lisp của mình hay bị lỗi ở các bản vẽ có dung lượng lớn và có định dang ko chuẩn. Bạn có thể khắc phục được lỗi này giúp mình ko ? Mình xin UP lên cái bản vẽ của mỉnh cho ban test nhé :

http://www.cadviet.com/upfiles/Km339.rar

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
.................

Mình xin UP lên cái bản vẽ của mỉnh cho ban test nhé :

http://www.cadviet.com/upfiles/Km339.rar

Trong file Km339.dwg chưa có Layer Plinetntn.

-> Do đó LISP của bạn không làm gì cả!

Vui lòng Upload file CAD khi chạy LIST trên bị lỗi. (file CAD có chứa đối tượng trong Layer : Plinetntn)

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
Mình đã sửa theo bạn, thực ra thì nó vẫn vậy thôi. Khi bản vẽ có dung lượng >2Mb( Nhiều đối tượng ) thì nó báo lỗi như mình nêu và ko chạy, mình thử xoa đi gần hết bản vẽ chỉ để lại ít đối tượng thì nó chạy ngon lành. Đó cũng là 1 nghĩa của cái ý định dạng sai khác của bản vẽ như mình đã nói. Vì nhiều Lisp của mình hay bị lỗi ở các bản vẽ có dung lượng lớn và có định dang ko chuẩn. Bạn có thể khắc phục được lỗi này giúp mình ko ? Mình xin UP lên cái bản vẽ của mỉnh cho ban test nhé :

http://www.cadviet.com/upfiles/Km339.rar

Chào bạn hhhhgggg,

Đúng như bác Giabach đã nói, bản vẽ bạn gửi chưa có layer plinetntn. Khi mình chạy lisp của bạn thấy đúng như cái kết quả bạn muốn mà. Kết thúc là dòng thông báo chưa có layer plinetntn.

Tuy nhiên khi mình đã khởi tạo một layer plinetntn vào bản vẽ của bạn, kết quả vẫn ra dòng thông báo này?????.

Điều này chứng tỏ lisp vẫn chạy bình thường nhưng có lẽ bạn nên sửa lại vị trí đặt dòng thông báo của bạn vào bên trong hàm if thì đúng hơn bạn ạ.

 

Chúc bạn thành cô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
hhhhgggg    30
Chào bạn hhhhgggg,

Đúng như bác Giabach đã nói, bản vẽ bạn gửi chưa có layer plinetntn. Khi mình chạy lisp của bạn thấy đúng như cái kết quả bạn muốn mà. Kết thúc là dòng thông báo chưa có layer plinetntn.

Tuy nhiên khi mình đã khởi tạo một layer plinetntn vào bản vẽ của bạn, kết quả vẫn ra dòng thông báo này?????.

Điều này chứng tỏ lisp vẫn chạy bình thường nhưng có lẽ bạn nên sửa lại vị trí đặt dòng thông báo của bạn vào bên trong hàm if thì đúng hơn bạn ạ.

 

Chúc bạn thành công.

Em xin lỗi các bác nhưng mà đối với bản vẽ đó thì mình phải đổi Plinetntn thành "Thnhien" như vậy sẽ thấy lỗi. Nó là cái Layer của đường đen ấy mà !

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
Lisp này chạy tốt trên CAD 2002 và với các bản vẽ có định dạng "Chuẩn". trên 1 số bản vẽ có định dạng "Sai khác" thì nó thông báo dòng lỗi sau:

Specify new linetype scale <2.0000>: 2

Enter property to change [Color/LAyer/LType/ltScale/LWeight/Thickness]:

Mong bác Pro nào sửa giúp em với.

CODE

(defun c:0(/ dt )

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

(if (setq dt (ssget "X" (list (cons 8 "Plinetntn"))))

(command "chprop" dt "" "s" "2" "")

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

)

LISP của bạn bị lỗi khi dùng lệnh chprop kết hợp với chọn đối tượng bằng ssget "X".

Thực ra lệnh chprop chỉ cho phép chọn đối tượng trên TAB (Model hay Layout) hiện hành.

trong khi đó (ssget "X" (list (cons 8 "Plinetntn"))) sẽ trả về các đối tượng trên toàn bộ TAB(Model, catdoc, catngang,...) thuộc lớp Plinetntn -> lệnh chprop bị lỗi.

 

Cách khắc phục :

1.Chỉ chọn đối tượng trên TAB (Model hay Layout) hiện hành thuộc lớp Plinetntn

(ssget "X" (list (cons 410 (getvar "ctab"))(cons 8 "Plinetntn")))

Cách này có nhược điểm là phải thực hiện LISP lần lượt trên từng TAB(Model, catdoc, catngang,...) nhưng dễ kiểm soát hơn.

 

2.Vẫn sử dụng (ssget "X" (list (cons 8 "Plinetntn"))) để chọn các đối tượng trên toàn bộ TAB(Model, catdoc, catngang,...) thuộc lớp Plinetntn, sau đó dùng hàm EntMod để cập nhật Database cho các đối tượng này.

Ưu điểm là chỉ cần chạy LISP một lần (nhanh gọn) nhưng theo ý tui thì khó kiểm soát (không an toàn), bạn thử viết theo hướng này nhé.

 

Ngoài ra trong LISP của bạn có dòng lệnh :

(Command "layer" "m" "Plinetntn" "L" "Hidden2" "" "")

-> thay đổi Linetype của lớp Plinetntn thành Hidden2.

Điều này chỉ có tác dụng khi các đối tượng trên lớp Plinetntn được Set ở ByLayer.

 

Một thắc mắc nhỏ : Thông thường User vẽ các đối tượng trên Model sau đó dùng Layout để xuất bản vẽ (ploting) theo tỉ lệ mong muốn. Bản vẽ của bạn lại thực hiện trên Layout.

 

Hy vọng Lisp này đúng nhu cầu của bạn.

(defun c:0 (/ LayName curLay dt)
 (setq LayName (getstring "Nhap ten layer can thay doi kieu net :"))
 (if (tblsearch "layer" LayName)
   (progn
     (setq curLay (getvar "clayer"))
     (Command "layer" "m" LayName "L" "Hidden2" "" "")
     ;(prompt "\nChon doi tuong: ")
     (if (setq dt (ssget "X" (list (cons 410 (getvar "ctab"))(cons 8 LayName))))
(command "chprop" dt "" "s" "2" "lt" "ByLayer" "")
(alert (strcat "Khong co doi tuong tren layer "LayName " !"))
     )
     (setvar "clayer" curLay)
   )
   (alert (strcat "Chua co Layer : " LayName " !"))
 )
 (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
hhhhgggg    30
LISP của bạn bị lỗi khi dùng lệnh chprop kết hợp với chọn đối tượng bằng ssget "X".

Thực ra lệnh chprop chỉ cho phép chọn đối tượng trên TAB (Model hay Layout) hiện hành.

trong khi đó (ssget "X" (list (cons 8 "Plinetntn"))) sẽ trả về các đối tượng trên toàn bộ TAB(Model, catdoc, catngang,...) thuộc lớp Plinetntn -> lệnh chprop bị lỗi.

 

Cách khắc phục :

1.Chỉ chọn đối tượng trên TAB (Model hay Layout) hiện hành thuộc lớp Plinetntn

(ssget "X" (list (cons 410 (getvar "ctab"))(cons 8 "Plinetntn")))

Cách này có nhược điểm là phải thực hiện LISP lần lượt trên từng TAB(Model, catdoc, catngang,...) nhưng dễ kiểm soát hơn.

 

2.Vẫn sử dụng (ssget "X" (list (cons 8 "Plinetntn"))) để chọn các đối tượng trên toàn bộ TAB(Model, catdoc, catngang,...) thuộc lớp Plinetntn, sau đó dùng hàm EntMod để cập nhật Database cho các đối tượng này.

Ưu điểm là chỉ cần chạy LISP một lần (nhanh gọn) nhưng theo ý tui thì khó kiểm soát (không an toàn), bạn thử viết theo hướng này nhé.

 

Ngoài ra trong LISP của bạn có dòng lệnh :

(Command "layer" "m" "Plinetntn" "L" "Hidden2" "" "")

-> thay đổi Linetype của lớp Plinetntn thành Hidden2.

Điều này chỉ có tác dụng khi các đối tượng trên lớp Plinetntn được Set ở ByLayer.

 

Một thắc mắc nhỏ : Thông thường User vẽ các đối tượng trên Model sau đó dùng Layout để xuất bản vẽ (ploting) theo tỉ lệ mong muốn. Bản vẽ của bạn lại thực hiện trên Layout.

 

Hy vọng Lisp này đúng nhu cầu của bạn.

(defun c:0 (/ LayName curLay dt)
 (setq LayName (getstring "Nhap ten layer can thay doi kieu net :"))
 (if (tblsearch "layer" LayName)
   (progn
     (setq curLay (getvar "clayer"))
     (Command "layer" "m" LayName "L" "Hidden2" "" "")
     ;(prompt "\nChon doi tuong: ")
     (if (setq dt (ssget "X" (list (cons 410 (getvar "ctab"))(cons 8 LayName))))
(command "chprop" dt "" "s" "2" "lt" "ByLayer" "")
(alert (strcat "Khong co doi tuong tren layer "LayName " !"))
     )
     (setvar "clayer" curLay)
   )
   (alert (strcat "Chua co Layer : " LayName " !"))
 )
 (princ)
)

ko được bác à ? Bác xem test lại cho em cái, vẫn báo lỗi như cũ. Vấn đề là cái định dạng của bản vẽ nữa. Với lại em muốn cái tên layer là mặc định có sẵn từ trước rùi chứ ko phải là do người dùng nhập vào. Như vậy mới đẩy nhanh tốc độ đượ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
gia_bach    1.442
ko được bác à ? Bác xem test lại cho em cái, vẫn báo lỗi như cũ. Vấn đề là cái định dạng của bản vẽ nữa. Với lại em muốn cái tên layer là mặc định có sẵn từ trước rùi chứ ko phải là do người dùng nhập vào. Như vậy mới đẩy nhanh tốc độ được !

Test trên Cad 2004 và Cad2008 file Km339.dwg với layer Thnhien đều OK.

Thực sự tui không hiểu bạn bị lỗi gì.

LISP sửa lại theo tên mặc định có sẵn từ trước ("Thnhien").

(defun c:0 (/ LayName curLay dt)
 ;(setq LayName (getstring "Nhap ten layer can thay doi kieu net : <Thnhien>"))
 ;(if (= LayName "") (setq LayName "Thnhien" ))
 (setq LayName "Plinetntn" )
 (if (tblsearch "layer" LayName)
   (progn
     (setq curLay (getvar "clayer"))
     (Command "layer" "m" LayName "L" "Hidden2" "" "")
     ;(prompt "\nChon doi tuong: ")
     (if (setq dt (ssget "X" (list (cons 410 (getvar "ctab"))(cons 8 LayName))))
(command "chprop" dt "" "s" "2" "lt" "ByLayer" "")
(alert (strcat "Khong co doi tuong tren layer "LayName " !"))
     )
     (setvar "clayer" curLay)
   )
   (alert (strcat "Chua co Layer : " LayName " !"))
 )
 (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
hhhhgggg    30
Test trên Cad 2004 và Cad2008 file Km339.dwg với layer Thnhien đều OK.

Thực sự tui không hiểu bạn bị lỗi gì.

LISP sửa lại theo tên mặc định có sẵn từ trước ("Thnhien").

(defun c:0 (/ LayName curLay dt)
 ;(setq LayName (getstring "Nhap ten layer can thay doi kieu net : <Thnhien>"))
 ;(if (= LayName "") (setq LayName "Thnhien" ))
 (setq LayName "Plinetntn" )
 (if (tblsearch "layer" LayName)
   (progn
     (setq curLay (getvar "clayer"))
     (Command "layer" "m" LayName "L" "Hidden2" "" "")
     ;(prompt "\nChon doi tuong: ")
     (if (setq dt (ssget "X" (list (cons 410 (getvar "ctab"))(cons 8 LayName))))
(command "chprop" dt "" "s" "2" "lt" "ByLayer" "")
(alert (strcat "Khong co doi tuong tren layer "LayName " !"))
     )
     (setvar "clayer" curLay)
   )
   (alert (strcat "Chua co Layer : " LayName " !"))
 )
 (princ)
)

ok ! Lần này thì ok Thật. 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

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  

×