Đến nội dung


Hình ảnh

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 !


  • Please log in to reply
9 replies to this topic

#1 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 12 February 2009 - 06:21 PM

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)
)
  • 0
Hoàng Giang

#2 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 12 February 2009 - 07:50 PM

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.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#3 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 12 February 2009 - 10:36 PM

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.c...files/Km339.rar
  • 0
Hoàng Giang

#4 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 13 February 2009 - 11:10 AM

.................
Mình xin UP lên cái bản vẽ của mỉnh cho ban test nhé :
http://www.cadviet.c...files/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)
  • 0

#5 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 13 February 2009 - 12:41 PM

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.c...files/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.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#6 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 13 February 2009 - 02:13 PM

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à !
  • 0
Hoàng Giang

#7 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 13 February 2009 - 03:35 PM

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 [color="#0000FF"]chỉ cho phép chọn đối tượng trên TAB (Model hay Layout) hiện hành.[/color]
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)
)


  • 0

#8 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 14 February 2009 - 10:43 PM

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 !
  • 0
Hoàng Giang

#9 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 15 February 2009 - 03:50 PM

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

  • 0

#10 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 15 February 2009 - 05:30 PM

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é !
  • 0
Hoàng Giang