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  
nhatminhrd

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

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

nhatminhrd    3

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

Chỉnh sửa theo ketxu
Sai tiê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
lp_hai    207

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

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

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
nhatminhrd    3

 

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.

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

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.

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
nhatminhrd    3

 

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

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

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

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
nhatminhrd    3

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.com/?igfxu3khhef5gx0

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  

×