Đến nội dung


Hình ảnh
- - - - -

[Yêu cầu] Lisp thay đổi giá trị Lineweight trong Layer Properties Manage


  • Please log in to reply
7 replies to this topic

#1 nhatminhrd

nhatminhrd

    biết vẽ circle

  • Members
  • PipPip
  • 35 Bài viết
Điểm đánh giá: 3 (bình thường)

Đã gửi 24 October 2011 - 10:01 AM

Tức là tìm 2 điểm thuộc 2 Spline sao cho khoảng cách của chúng là nhỏ nhất.



Nhờ các bạn gúp mình cái lisp này với, công việc cụ thể như sau:

File CAD của mình có rất nhiều layer tương ứng cho các bộ môn, tên layer được quy định đồng nhất trong toàn cty, ví dụ như:

Bộ môn kiến trúc: 000-ARC-...; 001-ARC-....; ...; 009-ARC-...
Bộ môn kết cấu: 010-STR-...; 011-STR-...; ...; 019-STR-...
Bộ môn điện: 020-ELC-...; 021-ELC-...
Bộ môn nước: 030-CTN-...; 031-CTN-...
....

Giờ các bản vẽ của các bộ môn chuyển sang cho nhau để làm tiếp, ví dụ như Kiến trúc chuyển file cho Điện Nước để làm tiếp chẳng hạn. Mình muốn viết 1 LISP để thay đổi giá trị lineweight của layer, ví dụ như: các layer của các bộ môn khác đưa về giá trị 0.05, còn các layer của bộ môn Điện Nước đưa về một số giá trị khác như 0.1; 0.4 được định sẵn trong LISP...

(Phần khung tên thì dung Block với Polyline và Att rồi nên không ngại vấn đề độ dày nét khi in ở từng bộ môn.)

LISP có kiểu như thế này:

CHLW ---> CHON BO MON [KT/STR/ELC/CTN/...] <KT> ---> thực hiện thay đổi giá trị lineweight tương ứng

Cám ơn cả nhà đã quan tâm./.

Bài viết đã được chỉnh sửa nội dung bởi ketxu: 24 October 2011 - 08:09 PM
Sai tiêu đề

  • 0

#2 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 24 October 2011 - 02:41 PM

như mình biết thì thông thường người ta hay dùng xref giữa các bộ phận. còn nếu đúng như trường hợp bạn nói là ko dùng xref rồi.
Khi in nếu in theo lineweigth - như bạn nói thì bạn có thể vào layer manager và bạn tạo Group layer theo từ bộ môn. khi này bạn muốn bộ môn nào là 0.05 bạn chỉ việc chọn tất cả các layer có trong group đó và chỉnh chiều dày nét cho nó!
vấn đề ở đây là việc này chỉ làm được một chiều. VD lúc đầu bạn vẽ Kiền trúc có các nét với các độ dày khác nhau. xong rồi gửi wa điện làm thay đổi layer kiến trúc về 0.05. điện làm xong gửi lại cho kiến trúc thì sao?? ko lẽ lại chỉnh lại từng layer kiến trúc đã bị thay đổi??
tốt nhất là làm xref
  • 0
Hình đã gửi

#3 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 24 October 2011 - 05:03 PM

Nhờ các bạn gúp mình cái lisp này với, công việc cụ thể như sau: File CAD của mình có rất nhiều layer tương ứng cho các bộ môn, tên layer được quy định đồng nhất trong toàn cty, ví dụ như: Bộ môn kiến trúc: 000-ARC-...; 001-ARC-....; ...; 009-ARC-... Bộ môn kết cấu: 010-STR-...; 011-STR-...; ...; 019-STR-... Bộ môn điện: 020-ELC-...; 021-ELC-... Bộ môn nước: 030-CTN-...; 031-CTN-... .... Giờ các bản vẽ của các bộ môn chuyển sang cho nhau để làm tiếp, ví dụ như Kiến trúc chuyển file cho Điện Nước để làm tiếp chẳng hạn. Mình muốn viết 1 LISP để thay đổi giá trị lineweight của layer, ví dụ như: các layer của các bộ môn khác đưa về giá trị 0.05, còn các layer của bộ môn Điện Nước đưa về một số giá trị khác như 0.1; 0.4 được định sẵn trong LISP... (Phần khung tên thì dung Block với Polyline và Att rồi nên không ngại vấn đề độ dày nét khi in ở từng bộ môn.) LISP có kiểu như thế này: CHLW ---> CHON BO MON [KT/STR/ELC/CTN/...] <KT> ---> thực hiện thay đổi giá trị lineweight tương ứng Cám ơn cả nhà đã quan tâm./.


Hề hề hề,
Bạn dùng thử cái này coi đã ưng ý chưa nhé.
Mình không làm đúng yêu cầu của bạn, nếu bạn muốn co thể tự chỉnh sửa lại các nội dung thông báo trên màn hình cho phù hợp, Mình vốn hơi lười sửa, mong bạn thông cảm.


(defun c:chlw (/ lalst la lw )
(command "undo" "be")
(setq lalst (list)
la (tblnext "layer" T)
lalst (cons (cdr (assoc 2 la)) lalst)
)
(while (setq la (tblnext "layer"))
(setq lalst (cons (cdr (assoc 2 la)) lalst))
)
(setq la (getstring t "\n Nhap ten layer chuan: ")
lw (getreal "\n Nhap gia tri lineweight chuan: ")
)
(foreach x lalst
(if (/= (strcase x) (strcase la))
(command "layer" "lw" 0.05 x "")
(command "layer" "lw" lw x "")
)
)
(command "undo" "e")
(princ)
)

Chúc bạn vui.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#4 nhatminhrd

nhatminhrd

    biết vẽ circle

  • Members
  • PipPip
  • 35 Bài viết
Điểm đánh giá: 3 (bình thường)

Đã gửi 26 October 2011 - 08:57 AM


Hề hề hề,
Bạn dùng thử cái này coi đã ưng ý chưa nhé.
Mình không làm đúng yêu cầu của bạn, nếu bạn muốn co thể tự chỉnh sửa lại các nội dung thông báo trên màn hình cho phù hợp, Mình vốn hơi lười sửa, mong bạn thông cảm.



(defun c:chlw (/ lalst la lw )
(command "undo" "be")
(setq lalst (list)
la (tblnext "layer" T)
lalst (cons (cdr (assoc 2 la)) lalst)
)
(while (setq la (tblnext "layer"))
(setq lalst (cons (cdr (assoc 2 la)) lalst))
)
(setq la (getstring t "\n Nhap ten layer chuan: ")
lw (getreal "\n Nhap gia tri lineweight chuan: ")
)
(foreach x lalst
(if (/= (strcase x) (strcase la))
(command "layer" "lw" 0.05 x "")
(command "layer" "lw" lw x "")
)
)
(command "undo" "e")
(princ)
)

Chúc bạn vui.


-----------------
thanh bạn nhiều, nghiên cứu và chỉnh sửa theo fiel bạn gửi đã, lúc nào OK mình thông báo lại nha.
  • 1

#5 nhatminhrd

nhatminhrd

    biết vẽ circle

  • Members
  • PipPip
  • 35 Bài viết
Điểm đánh giá: 3 (bình thường)

Đã gửi 26 October 2011 - 09:00 AM

như mình biết thì thông thường người ta hay dùng xref giữa các bộ phận. còn nếu đúng như trường hợp bạn nói là ko dùng xref rồi.
Khi in nếu in theo lineweigth - như bạn nói thì bạn có thể vào layer manager và bạn tạo Group layer theo từ bộ môn. khi này bạn muốn bộ môn nào là 0.05 bạn chỉ việc chọn tất cả các layer có trong group đó và chỉnh chiều dày nét cho nó!
vấn đề ở đây là việc này chỉ làm được một chiều. VD lúc đầu bạn vẽ Kiền trúc có các nét với các độ dày khác nhau. xong rồi gửi wa điện làm thay đổi layer kiến trúc về 0.05. điện làm xong gửi lại cho kiến trúc thì sao?? ko lẽ lại chỉnh lại từng layer kiến trúc đã bị thay đổi??
tốt nhất là làm xref



--------

đúng là cái này cũng chỉ cần 1 chiều thôi bạn à. Mỗi bộ môn có thể làm 1 lisp riêng cho mình, chỉnh sửa lineweight của bộ môn mình thôi, còn các layer khác cho cái giá trị 0.05 vào là ok. hjhj.

quan trọng bây giờ là làm được cái việc thay đổi lineweight của 1 layer có tên cụ thể ABCDEF bằng LISP đã, xong tiếp tục hoàn thiện dần.
  • 0

#6 nhatminhrd

nhatminhrd

    biết vẽ circle

  • Members
  • PipPip
  • 35 Bài viết
Điểm đánh giá: 3 (bình thường)

Đã gửi 26 October 2011 - 09:54 AM


-----------------
thanh bạn nhiều, nghiên cứu và chỉnh sửa theo fiel bạn gửi đã, lúc nào OK mình thông báo lại nha.


------------------------------------------

Mình thay đổi ý tưởng như thế này, bạn nghiên cứu giúp mình cái nha:

(1) sử dụng lisp : CHLW
(2) Lập list các layer có trong bản vẽ (gọi là LIST1, thông tin là tên layer)
(3) "Chọn bo mon [KT / ST / ... ]" >>>>>>>> chọn bộ môn tương ứng với người đang vẽ nó (vd KT)
(4) Import list các layer của bộ môn đó đã có trong 1 file TEXT trên máy tính (cố định đường dẫn tới file hoặc cho chọn file), trong file chứa thông tin về tên layer, màu, lineweight, ... mỗi thông tin trên 1 dòng (tạm thời có 2 dòng trong trường hợp này là tên và lineweight) >>> gọi là LIST2
(5) Xét lần lượt các layer theo LIST1 >>>>> nếu có tong LIST2 thì lấy lineweight giá trị có trong LISt2; nếu nằm ngoài thì cho giá trị là 0.05
kết thúc./.
  • 0

#7 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 26 October 2011 - 01:41 PM


------------------------------------------

Mình thay đổi ý tưởng như thế này, bạn nghiên cứu giúp mình cái nha:

(1) sử dụng lisp : CHLW
(2) Lập list các layer có trong bản vẽ (gọi là LIST1, thông tin là tên layer)
(3) "Chọn bo mon [KT / ST / ... ]" >>>>>>>> chọn bộ môn tương ứng với người đang vẽ nó (vd KT)
(4) Import list các layer của bộ môn đó đã có trong 1 file TEXT trên máy tính (cố định đường dẫn tới file hoặc cho chọn file), trong file chứa thông tin về tên layer, màu, lineweight, ... mỗi thông tin trên 1 dòng (tạm thời có 2 dòng trong trường hợp này là tên và lineweight) >>> gọi là LIST2
(5) Xét lần lượt các layer theo LIST1 >>>>> nếu có tong LIST2 thì lấy lineweight giá trị có trong LISt2; nếu nằm ngoài thì cho giá trị là 0.05
kết thúc./.

Hề hề hề,
Bạn hãy gửi cái file text chừa thông tin về các layer của mỗi bộ môn lên nhé.
Đây là một bài toán khác với yêu cầu ban đầu của bạn. Khi đó bạn nói là mỗi một bộ môn chì có 1 layer mang tên riêng của bộ môn đó.
Việc thay đổi đề bài thế này thường kéo theo sự không hài lòng của người viết lisp. Lần sau bạn nên suy nghĩ kỹ hơn trước khi yêu cầu nhé.
Chúc bạn vui....
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#8 nhatminhrd

nhatminhrd

    biết vẽ circle

  • Members
  • PipPip
  • 35 Bài viết
Điểm đánh giá: 3 (bình thường)

Đã gửi 31 October 2011 - 06:24 PM

Hề hề hề,
Bạn hãy gửi cái file text chừa thông tin về các layer của mỗi bộ môn lên nhé.
Đây là một bài toán khác với yêu cầu ban đầu của bạn. Khi đó bạn nói là mỗi một bộ môn chì có 1 layer mang tên riêng của bộ môn đó.
Việc thay đổi đề bài thế này thường kéo theo sự không hài lòng của người viết lisp. Lần sau bạn nên suy nghĩ kỹ hơn trước khi yêu cầu nhé.
Chúc bạn vui....



----------------------------
Thank bác đã quan tâm

Chắc là em chưa diễn đạt thoát ý nên có sự hiểu lầm lẫn lộn giữa 2 lần như bác nói, nhưng thực chất thì ý đồ của em vẫn chỉ có 1 thôi. Em gửi lên cái file TEXT quy định về tên và chiều dày đặt nét (giá trị lineweight) và file CAD để test bác nhé.

Nhắc lại ý đồ của LISP sẽ như thế này: (1) Lệnh chlw >>> (2) Chọn đến file TEXT quy định về tên và đặt nét >>> (3) Thực thi: so sánh các layer có trong bản vẽ hiện thời nếu có tên trong file TEXT kia thì lấy giá trị lineweight theo quy định trong file, nếu không có thì đưa giá trị lineweight về 0.5 >>> Kết thúc lệnh.

file để test đây:
http://www.mediafire...igfxu3khhef5gx0
  • 0