Đến nội dung


Hình ảnh
* * * - - 2 Bình chọn

Viết Lisp theo yêu cầu


  • Chủ đề bị khóa Chủ đề bị khóa
2780 replies to this topic

#321 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 19 November 2007 - 08:57 AM

chắc mấy ngày cuối tuần bác vndesperados bị vợ hành nên quên rồi.hic! tội mấy anh em đợi.trời này mà lên dà lạt với vợ chắc là lạnh lắm đây
Mà tại sao bác Hoành không chịu giup nhi??? :bigsmile:

Vndesperados thì không rõ, nhưng chắc chắn là bác Hoành sẽ không làm!
Ssg cũng không làm, nhưng có vài ý kiến liên quan:

- Về lập trình lisp, rất khó tìm ra được một thuật giải dạng như “cây đũa thần”, có tác dụng khuyếch đại mọi thao tác liên quan đến geometry của mọi đối tượng. Muốn đạt được mục đích đã nêu, có lẽ phải “can thiệp thô bạo” vào tất cả các lệnh trong nhóm Draw và Modify của Acad. Đó là nói trên nguyên tắc, còn cụ thể thì không "dễ chơi", nếu không muốn nói là không tưởng. Chương trình lisp có thể gọi lệnh AutoCAD tùy ý, nhưng thay đổi cách hành xử thông thường các lệnh AutoCAD là việc làm rất nguy hiểm. Chính người lập trình cũng không thể lường hết những hậu quả có thể xảy ra. Bản thân ssg không bao giờ làm cái việc điên rồ ấy!

- Giả sử có được chương trình theo yêu cầu, khi sử dụng cũng chẳng sướng ích gì vì cứ phải “lăn tăn” trong đầu là mình đang ở tỷ lệ nào?

- Yêu cầu trên đúng là xuất phát từ một nhu cầu thực tế. Nhưng cái thực tế ấy là hệ quả tất yếu của một cách làm không hợp lý khi muốn trình bày nhiều tỷ lệ khác nhau trên cùng một bản vẽ: scale hình và sửa dimscale. Đáng tiếc là cách làm này cũng khá phổ biến, ngay cả với chính bản thân người viết bài này! Tuy nhiên, mình chỉ sử dụng trong những trường hợp đơn giản, ít liên quan đến những phần khác của bản vẽ cũng như với các bản vẽ khác.

Vấn đề này cũng đã được thảo luận nhiều ở topic “Vẽ nhiều tỷ lệ trong một bản vẽ”. Ssg cũng có bài viết ở đó, nhưng hôm diễn đàn mất dữ liệu nó cũng đi theo luôn. Một lần nữa, xin trình bày lại quan điểm như sau:

- Nếu bạn đang ở giai đoạn vẽ ban đầu thì cũng không có vấn đề gì, chỉ cần 3 lệnh: copy, scale và thiết lập dimstyle là OK ngay. Nhưng bất cứ ai đã dính vào cái “nghiệp” thiết kế đều hiểu rất rõ rằng, để hoàn thiện một thiết kế, tổng thời gian biên tập, chỉnh sửa, hiệu đính… lớn hơn gấp nhiều lần so với thời gian vẽ. Một hồ sơ thiết kế được cho là hoàn thiện, nhưng chỉ cần một “ý kiến nhỏ” từ phía chủ đầu tư, có thể phải sửa lại hàng loạt bản vẽ. Với cách làm trên, để chỉnh sửa một yếu tố nào đó, ngoài việc phải lặp đi lặp lại cùng một thao tác trên nhiều hình vẽ khác nhau, còn phải tính toán, nhân chia theo tỷ lệ tương ứng (không khác cái thời vẽ tay ngày xưa là mấy). Thật vô lý và “phản Autodesk”!

- Nếu dùng layout để trình bày bản vẽ, bạn sẽ không bao giờ gặp phải những chuyện vô lý như vậy, và chắc chắn cũng sẽ không có cái yêu cầu viết lisp này. Nếu bạn chưa quen sử dụng layout, hoặc còn nghi ngờ về công dụng cũng như quan điểm của Autodesk về việc dùng model và layout, xin được trích dẫn nguyên văn “Overview of Layouts” trong Help, kèm theo translation:

The AutoCAD window provides two parallel working environments represented by the Model and Layout tabs. Working on the Model tab, you draw a model of your subject. On the layout tabs, you can arrange multiple "snapshots" of the model. Each layout represents a drawing sheet that can display one or more views of the model at various scales.
The Model tab accesses a limitless drawing area. In model space, you draw at 1:1 scale, and you decide whether one unit represents one inch (for a bracket) or one meter (for a bridge).
Layout tabs access virtual drawing sheets. When you set up a layout, you tell AutoCAD the sheet size you want to use. The layout represents the drawing sheet. This layout environment is called paper space.
In a layout, you can create and position viewports, and you can add dimensions, a title block, or other geometry. Viewports display a drawing's model space objects, that is, the objects you created on the Model tab. Each viewport can display the model space objects at a specified scale.
You can create multiple layouts in a drawing; each layout can contain different plot settings and paper sizes.

AutoCAD cung cấp đồng thời 2 môi trường làm việc gọi là Model và Layout. Khi làm việc trong Model, bạn vẽ mô hình của đối tượng. Trong layout, bạn có thể trình bày nhiều “ảnh chụp” của mô hình. Mỗi layout mô tả một tờ giấy, trên đó hiển thị một hoặc nhiều góc nhìn của mô hình với những tỷ lệ khác nhau.
Model không giới hạn vùng vẽ. Trong không gian mô hình, bạn vẽ ở tỷ lệ 1:1 và tùy ý quy định 1 đơn vị trên bản vẽ tương ứng với 1 inch (cho một cái giá đỡ) hoặc 1 mét (cho một chiếc cầu).
Layout được xem như tờ giấy ảo. Khi bạn thiết lập một layout, bạn phải khai báo khổ giấy sử dụng. Môi trường layout được gọi là không gian giấy.
Trong layout, bạn có thể tạo và sắp xếp các khung nhìn, có thể ghi kích thước, ghi chú hoặc các đối tượng hình học khác. Các khung nhìn hiển thị các đối tượng trong không gian mô hình với một tỷ lệ xác định.
Bạn có thể tạo nhiều layout trong một bản vẽ. Mỗi layout có thể khác nhau về khổ giấy và các thiết lập khác khi in.


- Ngoài ra, bạn cũng có thể open các bản vẽ trong thư mục Sample (version nào cũng có) của Acad để tham khảo thêm về cách dùng layout của họ. Chẳng hạn như bản vẽ chiếc đồng hồ watch.dwg trong Sample, ở model chỉ có 1 hình nhưng trong layout họ trình bày cực kỳ ấn tượng.

Xin chốt lại vấn đề, vẽ theo tỷ lệ 1:1 trong model và dùng layout để trình bày có những lợi ích rất cơ bản sau:
1) Đối tượng luôn luôn được vẽ với kích thước thật của nó, bạn không bao giờ phải bận tâm đến việc phải nhân chia tỷ lệ khi vẽ.
2) Kết quả đo chiều dài, diện tích, thể tích, khối lượng, trọng tâm, mô men quán tính… nói chung là tất cả các đặc trưng hình học của đối tượng bằng các lệnh distance, area, lengthen, massprop luôn luôn đúng với thực tế.
3) Mối đối tượng chỉ cần vẽ 1 lần trong model nhưng có thể trình bày nhiều lần, nhiều nơi, với nhiều góc nhìn, nhiều tỷ lệ khác nhau tùy ý trong layout. Khi chỉnh sửa, tất nhiên cũng chỉ cần 1 lần duy nhất trong model. Toàn bộ các kích thước, nếu không bị độ chế, tức là còn giữ được thuộc tính associate, sẽ tự động update trên tất cả các khung nhìn.
4) Vẽ phối hợp nhiều yếu tố khác nhau nhưng có quan hệ với nhau về kích thước, vị trí, lắp ghép… trong cùng một model và có thể dùng nhiều layout khác nhau để in ra từng nhóm tùy theo mục đích sử dụng. Ví dụ, bản vẽ 1stfloor.dwg trong Sample, họ vẽ phối hợp toàn bộ trong model và trình bày trên 3 layout các bản vẽ khác nhau: kiến trúc, sơ đồ điện và sơ đồ chiếu sáng.
5) Copy qua lại và phối hợp nhiều file *.dwg với nhau trong một project lớn rất thuận lợi, cũng không phải bận tâm đến việc chúng ở tỷ lệ nào, đặc biệt là khi bạn làm việc theo nhóm và cần trao đổi dữ liệu với nhau bằng file *.dwg.

Luôn luôn vẽ với kích thước thật và biết dùng Layout để trình bày bản vẽ là phong cách của người sử dụng AutoCAD pro!

  • 0

#322 ngayve324

ngayve324

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 515 Bài viết
Điểm đánh giá: 270 (khá)

Đã gửi 19 November 2007 - 09:31 AM

Vndesperados thì không rõ, nhưng chắc chắn là bác Hoành sẽ không làm!
Ssg cũng không làm, nhưng có vài ý kiến liên quan:

- Về lập trình lisp, rất khó tìm ra được một thuật giải dạng như “cây đũa thần”, có tác dụng khuyếch đại mọi thao tác liên quan đến geometry của mọi đối tượng. Muốn đạt được mục đích đã nêu, có lẽ phải “can thiệp thô bạo” vào tất cả các lệnh trong nhóm Draw và Modify của Acad. Đó là nói trên nguyên tắc, còn cụ thể thì không "dễ chơi", nếu không muốn nói là không tưởng. Chương trình lisp có thể gọi lệnh AutoCAD tùy ý, nhưng thay đổi cách hành xử thông thường các lệnh AutoCAD là việc làm rất nguy hiểm. Chính người lập trình cũng không thể lường hết những hậu quả có thể xảy ra. Bản thân ssg không bao giờ làm cái việc điên rồ ấy!

- Giả sử có được chương trình theo yêu cầu, khi sử dụng cũng chẳng sướng ích gì vì cứ phải “lăn tăn” trong đầu là mình đang ở tỷ lệ nào?

- Yêu cầu trên đúng là xuất phát từ một nhu cầu thực tế. Nhưng cái thực tế ấy là hệ quả tất yếu của một cách làm không hợp lý khi muốn trình bày nhiều tỷ lệ khác nhau trên cùng một bản vẽ: scale hình và sửa dimscale. Đáng tiếc là cách làm này cũng khá phổ biến, ngay cả với chính bản thân người viết bài này! Tuy nhiên, mình chỉ sử dụng trong những trường hợp đơn giản, ít liên quan đến những phần khác của bản vẽ cũng như với các bản vẽ khác.

Vấn đề này cũng đã được thảo luận nhiều ở topic “Vẽ nhiều tỷ lệ trong một bản vẽ”. Ssg cũng có bài viết ở đó, nhưng hôm diễn đàn mất dữ liệu nó cũng đi theo luôn. Một lần nữa, xin trình bày lại quan điểm như sau:

- Nếu bạn đang ở giai đoạn vẽ ban đầu thì cũng không có vấn đề gì, chỉ cần 3 lệnh: copy, scale và thiết lập dimstyle là OK ngay. Nhưng bất cứ ai đã dính vào cái “nghiệp” thiết kế đều hiểu rất rõ rằng, để hoàn thiện một thiết kế, tổng thời gian biên tập, chỉnh sửa, hiệu đính… lớn hơn gấp nhiều lần so với thời gian vẽ. Một hồ sơ thiết kế được cho là hoàn thiện, nhưng chỉ cần một “ý kiến nhỏ” từ phía chủ đầu tư, có thể phải sửa lại hàng loạt bản vẽ. Với cách làm trên, để chỉnh sửa một yếu tố nào đó, ngoài việc phải lặp đi lặp lại cùng một thao tác trên nhiều hình vẽ khác nhau, còn phải tính toán, nhân chia theo tỷ lệ tương ứng (không khác cái thời vẽ tay ngày xưa là mấy). Thật vô lý và “phản Autodesk”!

- Nếu dùng layout để trình bày bản vẽ, bạn sẽ không bao giờ gặp phải những chuyện vô lý như vậy, và chắc chắn cũng sẽ không có cái yêu cầu viết lisp này. Nếu bạn chưa quen sử dụng layout, hoặc còn nghi ngờ về công dụng cũng như quan điểm của Autodesk về việc dùng model và layout, xin được trích dẫn nguyên văn “Overview of Layouts” trong Help, kèm theo translation:

The AutoCAD window provides two parallel working environments represented by the Model and Layout tabs. Working on the Model tab, you draw a model of your subject. On the layout tabs, you can arrange multiple "snapshots" of the model. Each layout represents a drawing sheet that can display one or more views of the model at various scales.
The Model tab accesses a limitless drawing area. In model space, you draw at 1:1 scale, and you decide whether one unit represents one inch (for a bracket) or one meter (for a bridge).
Layout tabs access virtual drawing sheets. When you set up a layout, you tell AutoCAD the sheet size you want to use. The layout represents the drawing sheet. This layout environment is called paper space.
In a layout, you can create and position viewports, and you can add dimensions, a title block, or other geometry. Viewports display a drawing's model space objects, that is, the objects you created on the Model tab. Each viewport can display the model space objects at a specified scale.
You can create multiple layouts in a drawing; each layout can contain different plot settings and paper sizes.

AutoCAD cung cấp đồng thời 2 môi trường làm việc gọi là Model và Layout. Khi làm việc trong Model, bạn vẽ mô hình của đối tượng. Trong layout, bạn có thể trình bày nhiều “ảnh chụp” của mô hình. Mỗi layout mô tả một tờ giấy, trên đó hiển thị một hoặc nhiều góc nhìn của mô hình với những tỷ lệ khác nhau.
Model không giới hạn vùng vẽ. Trong không gian mô hình, bạn vẽ ở tỷ lệ 1:1 và tùy ý quy định 1 đơn vị trên bản vẽ tương ứng với 1 inch (cho một cái giá đỡ) hoặc 1 mét (cho một chiếc cầu).
Layout được xem như tờ giấy ảo. Khi bạn thiết lập một layout, bạn phải khai báo khổ giấy sử dụng. Môi trường layout được gọi là không gian giấy.
Trong layout, bạn có thể tạo và sắp xếp các khung nhìn, có thể ghi kích thước, ghi chú hoặc các đối tượng hình học khác. Các khung nhìn hiển thị các đối tượng trong không gian mô hình với một tỷ lệ xác định.
Bạn có thể tạo nhiều layout trong một bản vẽ. Mỗi layout có thể khác nhau về khổ giấy và các thiết lập khác khi in.


- Ngoài ra, bạn cũng có thể open các bản vẽ trong thư mục Sample (version nào cũng có) của Acad để tham khảo thêm về cách dùng layout của họ. Chẳng hạn như bản vẽ chiếc đồng hồ watch.dwg trong Sample, ở model chỉ có 1 hình nhưng trong layout họ trình bày cực kỳ ấn tượng.

Xin chốt lại vấn đề, vẽ theo tỷ lệ 1:1 trong model và dùng layout để trình bày có những lợi ích rất cơ bản sau:
1) Đối tượng luôn luôn được vẽ với kích thước thật của nó, bạn không bao giờ phải bận tâm đến việc phải nhân chia tỷ lệ khi vẽ.
2) Kết quả đo chiều dài, diện tích, thể tích, khối lượng, trọng tâm, mô men quán tính… nói chung là tất cả các đặc trưng hình học của đối tượng bằng các lệnh distance, area, lengthen, massprop luôn luôn đúng với thực tế.
3) Mối đối tượng chỉ cần vẽ 1 lần trong model nhưng có thể trình bày nhiều lần, nhiều nơi, với nhiều góc nhìn, nhiều tỷ lệ khác nhau tùy ý trong layout. Khi chỉnh sửa, tất nhiên cũng chỉ cần 1 lần duy nhất trong model. Toàn bộ các kích thước, nếu không bị độ chế, tức là còn giữ được thuộc tính associate, sẽ tự động update trên tất cả các khung nhìn.
4) Vẽ phối hợp nhiều yếu tố khác nhau nhưng có quan hệ với nhau về kích thước, vị trí, lắp ghép… trong cùng một model và có thể dùng nhiều layout khác nhau để in ra từng nhóm tùy theo mục đích sử dụng. Ví dụ, bản vẽ 1stfloor.dwg trong Sample, họ vẽ phối hợp toàn bộ trong model và trình bày trên 3 layout các bản vẽ khác nhau: kiến trúc, sơ đồ điện và sơ đồ chiếu sáng.
5) Copy qua lại và phối hợp nhiều file *.dwg với nhau trong một project lớn rất thuận lợi, cũng không phải bận tâm đến việc chúng ở tỷ lệ nào, đặc biệt là khi bạn làm việc theo nhóm và cần trao đổi dữ liệu với nhau bằng file *.dwg.

Luôn luôn vẽ với kích thước thật và biết dùng Layout để trình bày bản vẽ là phong cách của người sử dụng AutoCAD pro!


Hú vía. đúng là một bài viết hay. Sự thực nếu mình cũng dùng cad được Pro như Ssg thì mình cũng không hỏi cái lisp này làm gì nhưng các bác hãy nhình vào một thực tế, không phải một nấc lên trời được. đối với những người dùng cad không được rành (như tôi) và có thói quen trình bày bản vẽ trên model thì vẽ với tỷ lệ hình là điều thường chọn làm. Bản thân cũng thấy rất tệ khi chưa biết nhiều về cách trình bày bản vẽ trên layout. mục đích của mình hỏi cũng để các bác giúp mọi người có trình độ tầm tầm tầm như tôi có cái nhìn sâu hơn về lisp và cách để bỏ qua được các thói quen cổ hủ khi phải dùng giải pháp trên. Dù sao một bộ phận khá lớn vẫn đang còn vẽ trên Model(mà theo bác nói là không được Pro). thiết nghĩ, khi chưa có cách thay thế thì có được một lisp như trên vẫn khá cần thiết khi vẽ mà đở phải tính toán các tỷ lệ trên model. thấy các Bác cũng tranh luận nhiều về vấn đề vẽ trên layout hay trên model nhiều lắm, chắc từ bây giờ tôi sẽ làm quen với layout. cám ơn bác đã chia sẽ quan điểm.

Bài viết đã được chỉnh sửa nội dung bởi ngayve324: 19 November 2007 - 11:05 AM

  • 0

#323 pooh_21

pooh_21

    biết zoom

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

Đã gửi 19 November 2007 - 01:01 PM

@ssg :bigsmile: Mình nghĩ lệnh đó cũng không nhất thiết phải can thiệp thô bạo vào lệnh gốc như ssg nói. Mình ví dụ :

tên lệnh l25
chọn điểm p1
---> nhập khoảng các 1000
---> chọn điểm p2 (p2 ở đây có thể là điểm bất kỳ hoặc đơn thần là nằm trên trục x hoặc y để lisp còn nhận biết hướng vẽ đưòng line (hoặc nếu xác định được vị trí hiện tại của con chuột trên màn hình cad thì càng tốt)

chương trình lisp sẽ tự động nhân 4 với 1000 mình nhập lúc đầu, thế là mình có ngay một đoạn thẳng đài 1000 trong tỉ lệ 1/25.

Nếu chương trình lisp đơn giản người dùng chỉ cần copy đoạn lisp đó, rồi tự sửa tên lệnh thành l50 ... hoặc ci50... + nhân lên 2

không biết lập trình nhưng mình nghĩ nếu làm như vậy thì chắc chắn được :)
  • 0

#324 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 19 November 2007 - 02:00 PM

@ssg :bigsmile: Mình nghĩ lệnh đó cũng không nhất thiết phải can thiệp thô bạo vào lệnh gốc như ssg nói. Mình ví dụ :

tên lệnh l25
chọn điểm p1
---> nhập khoảng các 1000
---> chọn điểm p2 (p2 ở đây có thể là điểm bất kỳ hoặc đơn thần là nằm trên trục x hoặc y để lisp còn nhận biết hướng vẽ đưòng line (hoặc nếu xác định được vị trí hiện tại của con chuột trên màn hình cad thì càng tốt)

chương trình lisp sẽ tự động nhân 4 với 1000 mình nhập lúc đầu, thế là mình có ngay một đoạn thẳng đài 1000 trong tỉ lệ 1/25.

Nếu chương trình lisp đơn giản người dùng chỉ cần copy đoạn lisp đó, rồi tự sửa tên lệnh thành l50 ... hoặc ci50... + nhân lên 2

không biết lập trình nhưng mình nghĩ nếu làm như vậy thì chắc chắn được :)

Không đơn giản vậy, không riêng gì lệnh line, còn các lệnh khác thì sao? Nhất là các lệnh trong nhóm modify, như stretch chẳng hạn, rất khó xử lý. Đã làm thì phải triệt để, không thể nửa vời được.
Chiều ý các bạn, mình đã làm thử 1 đoạn sau, chỉ riêng cho lệnh line. Khi bạn dùng chuột định hướng và nhập số thì không có vấn đề gì, nhưng khi sử dụng object snap bạn sẽ thấy nó thế nào ấy. Mình muốn bắt dính vào một điểm, nó không vẽ đến đó mà chạy đi đâu mất tăm! Nói thật tình, mình không mê lập các chương trình loại này, và vẫn khuyến khích các bạn luôn luôn vẽ đúng kích thước thật và dùng layout để trình bày.

(defun C:LK( / k p1 p2 a L oldos);;;Line command with scale factor k
(if (not scf) (setq scf 1.0))
(setq k (getreal (strcat "\nScale factor <" (rtos scf) ">:" )))
(if (not k) (setq k scf) (setq scf k))
(setq p1 (getpoint "\nFrom point:"))
(setq oldos (getvar "osmode"))
(while (setq p2 (getpoint p1 "\nNext point:"))
(setq
a (angle p1 p2)
L (* k (distance p1 p2))
p2 (polar p1 a L)
)
(setvar "osmode" 0)
(command "line" p1 p2 "")
(setvar "osmode" oldos)
(setq p1 p2)
)
)

  • 0

#325 vndesperados

vndesperados

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 547 Bài viết
Điểm đánh giá: 253 (khá)

Đã gửi 19 November 2007 - 02:54 PM

Không đơn giản vậy, không riêng gì lệnh line, còn các lệnh khác thì sao? Nhất là các lệnh trong nhóm modify, như stretch chẳng hạn, rất khó xử lý. Đã làm thì phải triệt để, không thể nửa vời được.
Chiều ý các bạn, mình đã làm thử 1 đoạn sau, chỉ riêng cho lệnh line. Khi bạn dùng chuột định hướng và nhập số thì không có vấn đề gì, nhưng khi sử dụng object snap bạn sẽ thấy nó thế nào ấy. Mình muốn bắt dính vào một điểm, nó không vẽ đến đó mà chạy đi đâu mất tăm! Nói thật tình, mình không mê lập các chương trình loại này, và vẫn khuyến khích các bạn luôn luôn vẽ đúng kích thước thật và dùng layout để trình bày.

(defun C:LK( / k p1 p2 a L oldos);;;Line command with scale factor k
(if (not scf) (setq scf 1.0))
(setq k (getreal (strcat "\nScale factor <" (rtos scf) ">:" )))
(if (not k) (setq k scf) (setq scf k))
(setq p1 (getpoint "\nFrom point:"))
(setq oldos (getvar "osmode"))
(while (setq p2 (getpoint p1 "\nNext point:"))
(setq
a (angle p1 p2)
L (* k (distance p1 p2))
p2 (polar p1 a L)
)
(setvar "osmode" 0)
(command "line" p1 p2 "")
(setvar "osmode" oldos)
(setq p1 p2)
)
)


Thanks bác ssg nhé. Cái này về nghĩ thấy nhức đầu quá. Chỉ giải quyết được một chút thôi. Không làm triệt để được
Hehehehehe.
  • 0

#326 pooh_21

pooh_21

    biết zoom

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

Đã gửi 19 November 2007 - 03:10 PM

Mình muốn bắt dính vào một điểm, nó không vẽ đến đó mà chạy đi đâu mất tăm!

Nếu có điểm để bắt thì dùng luôn lệnh line chứ dùng lk làm gì nữa ssg :bigsmile:

Lệnh này chủ yếu giúp cho người vẽ đỡ phải nhân chia, cảm ơn ssg!
  • 0

#327 ngayve324

ngayve324

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 515 Bài viết
Điểm đánh giá: 270 (khá)

Đã gửi 19 November 2007 - 03:13 PM

Không đơn giản vậy, không riêng gì lệnh line, còn các lệnh khác thì sao? Nhất là các lệnh trong nhóm modify, như stretch chẳng hạn, rất khó xử lý. Đã làm thì phải triệt để, không thể nửa vời được.
Chiều ý các bạn, mình đã làm thử 1 đoạn sau, chỉ riêng cho lệnh line. Khi bạn dùng chuột định hướng và nhập số thì không có vấn đề gì, nhưng khi sử dụng object snap bạn sẽ thấy nó thế nào ấy. Mình muốn bắt dính vào một điểm, nó không vẽ đến đó mà chạy đi đâu mất tăm! Nói thật tình, mình không mê lập các chương trình loại này, và vẫn khuyến khích các bạn luôn luôn vẽ đúng kích thước thật và dùng layout để trình bày.

(defun C:LK( / k p1 p2 a L oldos);;;Line command with scale factor k
(if (not scf) (setq scf 1.0))
(setq k (getreal (strcat "\nScale factor <" (rtos scf) ">:" )))
(if (not k) (setq k scf) (setq scf k))
(setq p1 (getpoint "\nFrom point:"))
(setq oldos (getvar "osmode"))
(while (setq p2 (getpoint p1 "\nNext point:"))
(setq
a (angle p1 p2)
L (* k (distance p1 p2))
p2 (polar p1 a L)
)
(setvar "osmode" 0)
(command "line" p1 p2 "")
(setvar "osmode" oldos)
(setq p1 p2)
)
)

thanks bác Ssg về đoạn lisp này
đúng như bác nói thì khi sdụng lisp này thì phải lăn tăn mình đang ở tỉ lệ nào thật vì đoạn lisp này bắt ta nhập scale factor khi vẽ. vấn đề mình muốn hỏi là:bác có thể chỉnh lại lisp trên để khi mình đang ở tỷ lệ hiện hành thì lisp sẽ tự động scale mà không phai nhập scale factor khong?
yêu cầu có lẽ hơi khó. mong bác cho mấy đàn em được nở mày nở mặt. hi` hì.
chúc bác thành công!
Mình đồng ý với quan điểm của bác pooh_21. nếu có lện này thì người dùng khỏi phải tính toán khi vẽ và không quan trọng mình đang ở tỷ lệ nào. Ví dụ Dim hiện hành là 25 thì tự động nhân 4, dim 20 thì nhân 5, dim 50 thì nhân 2.... vì khi mình khai dimension style mình đã nhập hệ số scale factor rùi.
  • 0

#328 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 19 November 2007 - 03:40 PM

thanks bác Ssg về đoạn lisp này
đúng như bác nói thì khi sdụng phải lăn tăn mình đang ở tỉ lệ nào thật
"- Giả sử có được chương trình theo yêu cầu, khi sử dụng cũng chẳng sướng ích gì vì cứ phải “lăn tăn” trong đầu là mình đang ở tỷ lệ nào?"
bác có thể chỉnh lại để khi mình đang ở tỷ lệ hiện hành thì lisp sẽ tự động scale mà không phai nhập scale factor khong?
yêu cầu có lẽ hơi khó. mong bác cho mấy đàn em được nở mày nở mặt. hi` hì. chúc bác thành công

Nếu các bạn cảm thấy dùng được theo kiểu của lệnh LK trên thì mình sẽ bổ sung thêm chút nữa. Có mấy điều cần hỏi lại:
1) "Tỷ lệ hiện hành" theo ý bạn là gì? Có phải căn cứ vào "Overall Scale" của Dimstyle hiện hành không?
2) Ngoài line, có thể thêm vài lệnh thường dùng nữa trong nhóm Draw và Modify: Line, Circle, Rectangle, Copy, Move, Scale, và... gì nữa? Nói chung là giới hạn thôi chứ không làm hết được.

P/S:
Sorry, đọc lại bài trên của bạn thì hệ số tỷ lệ k = 1/Scale Factor ở tab Primary Unit. Đúng không?
  • 0

#329 ngayve324

ngayve324

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 515 Bài viết
Điểm đánh giá: 270 (khá)

Đã gửi 19 November 2007 - 04:18 PM

Nếu các bạn cảm thấy dùng được theo kiểu của lệnh LK trên thì mình sẽ bổ sung thêm chút nữa. Có mấy điều cần hỏi lại:
1) "Tỷ lệ hiện hành" theo ý bạn là gì? Có phải căn cứ vào "Overall Scale" của Dimstyle hiện hành không?
2) Ngoài line, có thể thêm vài lệnh thường dùng nữa trong nhóm Draw và Modify: Line, Circle, Rectangle, Copy, Move, Scale, và... gì nữa? Nói chung là giới hạn thôi chứ không làm hết được.

trước hết mình xin chân thành cám ơn và Hoan hô sự nhiệt tình của ssg.
nếu được bác có thể bổ sung thêm cái offset nữa
Như mình đã nói thì mình cũng chưa rành lắm về cad do vây bản vẽ của mình chỉ vẽ trên model. khi mình vẽ thì thường tạo các kiểu Dimstyle như 100, 25, 20, 10 để ghi cho các hình khác nhau. (mặt bằng 1/100, chi tiết 1/25, 1/20...)
Ví dụ khi mình khởi tạo 1 bve bằng MVSETUP với scale factor 1/100
sau đó tạo kiểu dim25 thì mình chọn Scale factor = 0.25 , 20 thì Scale factor = 0.25 trong thẻ Primary . còn cái "UnitsOverall Scale" thì không đụng tới
  • 0

#330 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 20 November 2007 - 07:33 AM

Nếu các bạn cảm thấy dùng được theo kiểu của lệnh LK trên thì mình sẽ bổ sung thêm chút nữa...

Tất cả có 6 lệnh: Line, Circle, Rectangle, Copy, Move, Offset. Có lẽ cũng đủ dùng cho các thao tác cơ bản?
Xin lưu ý các dòng nhắc nhở ở đầu chương trình. Tác giả vẫn bảo lưu quan điểm và mong rằng đến một lúc nào đó sẽ không còn ai cần đến chuơng trình này nữa!



;;;**************************************************************************
;;;WARNING:
;;;This program simulate some AutoCAD commands but all
;;;parameters are enlarged by scale K = 1/ Dimscale Factor
;;;Use in necessary cases only. DO NOT MISUSE !!!
;;;Written by ssg - www.cadviet.com - November, 2007
;;;**************************************************************************


;;;---------------------------------------------------------------------------------------
(defun PreScale(action / dsf) ;;;Get dimscale factor and osmode variable
(setq dsf (getvar "dimlfac"))
(setq k (/ 1 dsf))
(prompt (strcat "\n" action "\tDimscale factor=" (rtos dsf) "\tEnlarge scale=" (rtos k)))
(setq oldos (getvar "osmode"))
)
;;;================================================
(defun C:LK( / k oldos p1 p2 a L) ;;;Line command with scale k
(PreScale "LineK")
(setq p1 (getpoint "\nFirst point:"))
(while (setq p2 (getpoint p1 "\nNext point:"))
(setq
a (angle p1 p2)
L (* k (distance p1 p2))
p2 (polar p1 a L)
)
(setvar "osmode" 0)
(command "line" p1 p2 "")
(setvar "osmode" oldos)
(setq p1 p2)
)
(princ)
)
;;;================================================
(defun C:CIK( / k oldos p1 r) ;;;Draw circle with scale k
(PreScale "CircleK")
(setq
p1 (getpoint "\nCenter point:")
r (* k (getdist p1 "\nRadius:"))
)
(setvar "osmode" 0)
(command "circle" p1 r)
(setvar "osmode" oldos)
(princ)
)
;;;================================================
(defun C:RK( / k oldos w h p1 p2) ;;;Draw rectangle with scale k
(PreScale "RectangK")
(setq
w (getreal "\nWidth:")
h (getreal "\nHeight:")
p1 (getpoint "\nBase point:")
p2 (list (+ (car p1) (* k w)) (+ (cadr p1) (* k h)))
)
(setvar "osmode" 0)
(command "rectangle" p1 p2)
(setvar "osmode" oldos)
(princ)
)

;;;================================================
(defun C:CK( / k oldos ss p1 p2 a L) ;;;Copy command with scale k
(PreScale "CopyK")
(setq
ss (ssget)
p1 (getpoint "\nBase point:")
p2 (getpoint p1 "\nSecond point:")
a (angle p1 p2)
L (* k (distance p1 p2))
p2 (polar p1 a L)
)
(setvar "osmode" 0)
(command "copy" ss "" p1 p2)
(setvar "osmode" oldos)
(princ)
)
;;;================================================
(defun C:MK( / k oldos ss p1 p2 a L) ;;;Move command with scale k
(PreScale "MoveK")
(setq
ss (ssget)
p1 (getpoint "\nBase point:")
p2 (getpoint p1 "\nSecond point:")
a (angle p1 p2)
L (* k (distance p1 p2))
p2 (polar p1 a L)
)
(setvar "osmode" 0)
(command "move" ss "" p1 p2)
(setvar "osmode" oldos)
(princ)
)
;;;================================================
(defun C:OK( / k oldos ko) ;;;Offset command with scale k
(PreScale "OffsetK")
(if (not ofd) (setq ofd 10))
(setq ko (getreal (strcat "\nOffset distance <" (rtos ofd) ">:")))
(if (not ko) (setq ko ofd) (setq ofd ko))
(command "offset" (* k ko) pause)
(princ)
)
;;;================================================


  • 1

#331 ngayve324

ngayve324

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 515 Bài viết
Điểm đánh giá: 270 (khá)

Đã gửi 20 November 2007 - 09:44 AM

Tất cả có 6 lệnh: Line, Circle, Rectangle, Copy, Move, Offset. Có lẽ cũng đủ dùng cho các thao tác cơ bản?
Xin lưu ý các dòng nhắc nhở ở đầu chương trình. Tác giả vẫn bảo lưu quan điểm và mong rằng đến một lúc nào đó sẽ không còn ai cần đến chuơng trình này nữa!



;;;**************************************************************************
;;;WARNING:
;;;This program simulate some AutoCAD commands but all
;;;parameters are enlarged by scale K = 1/ Dimscale Factor
;;;Use in necessary cases only. DO NOT MISUSE !!!
;;;Written by ssg - www.cadviet.com - November, 2007
;;;**************************************************************************


Biết nói gì nhĩ. Tuyệt các bác ạ
Mình sẽ cố gắng để đến một lúc không còn cần chương trình này. nhưng Hiện tại thì thấy hay và cần thiết.
Mấy bác dùng thử rồi cho ý kiến. Thanks Ssg
  • 0

#332 pooh_21

pooh_21

    biết zoom

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

Đã gửi 20 November 2007 - 05:08 PM

@ssg lệnh trên đang thiếu tính năng đặt lại tỉ lệ scale, hiện tại khi chọn tỉ lệ lần đầu thì lần sau bật lại vẫn tiếp tục tỉ lệ đó :bigsmile:

Phiền ssg cho thêm một lệnh ví dụ tl (tỉ lệ) để thay đổi tỉ lệ vẽ cho các lệnh lk, ck, ... Thanks!
  • 0

#333 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 20 November 2007 - 05:29 PM

@ssg lệnh trên đang thiếu tính năng đặt lại tỉ lệ scale, hiện tại khi chọn tỉ lệ lần đầu thì lần sau bật lại vẫn tiếp tục tỉ lệ đó :bigsmile:

Phiền ssg cho thêm một lệnh ví dụ tl (tỉ lệ) để thay đổi tỉ lệ vẽ cho các lệnh lk, ck, ... Thanks!

Không có gì khó khăn. Nhưng đã thống nhất dùng K = 1/ Dimscale Factor rồi mà? Khi bạn thay đổi dimstyle hiện hành thì K tự động đổi theo. Thêm tùy chọn chủ động thiết lập k không hay đâu. Lại phải "lăn tăn trong đầu là mình đang ở tỷ lệ nào"!
  • 0

#334 ngayve324

ngayve324

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 515 Bài viết
Điểm đánh giá: 270 (khá)

Đã gửi 21 November 2007 - 04:46 PM

Cái này hay nhưng sao mọi nguwowig không cho ý kiến nhĩ. Phiền Bác Ssg có thể bổ sung thêm cái stretch được không?
  • 0

#335 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 22 November 2007 - 02:58 PM

Cái này hay nhưng sao mọi nguwowig không cho ý kiến nhĩ. Phiền Bác Ssg có thể bổ sung thêm cái stretch được không?

Mình đã nói từ trước rồi. Cái "thằng" stretch này "khó chơi" lắm, chưa nghĩ ra cách gì!
  • 0

#336 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 22 November 2007 - 03:09 PM

Mình đã nói từ trước rồi. Cái "thằng" stretch này "khó chơi" lắm, chưa nghĩ ra cách gì!


Ừm ! Đúng đó pà con. Cái này đối tượng chon không giống như mấy cái kia thôi tha cho bác ssg đi.
Mình dùng copy để lấy điểm chuẩn rối s bình thường cũng được. Khà khà :bigsmile:
  • 1

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#337 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 23 November 2007 - 08:19 AM

Mình đã nói từ trước rồi. Cái "thằng" stretch này "khó chơi" lắm, chưa nghĩ ra cách gì!

Có cách rồi, chưa giống lắm nhưng xài được:



;;;**************************************************************************
;;;WARNING:
;;;This program simulate some AutoCAD commands but all
;;;parameters are enlarged by scale K = 1/ Dimscale Factor
;;;Use in necessary cases only. DO NOT MISUSE !!!
;;;Written by ssg - www.cadviet.com - November, 2007
;;;**************************************************************************


;;;---------------------------------------------------------------------------------------
(defun PreScale(action / dsf) ;;;Get dimscale factor and osmode variable
(setq dsf (getvar "dimlfac"))
(setq k (/ 1 dsf))
(prompt (strcat "\n" action "\tDimscale factor=" (rtos dsf) "\tEnlarge scale=" (rtos k)))
(setq oldos (getvar "osmode"))
)
;;;================================================
(defun C:LK( / k oldos p1 p2 a L) ;;;Line command with scale k
(PreScale "LineK")
(setq p1 (getpoint "\nFirst point:"))
(while (setq p2 (getpoint p1 "\nNext point:"))
(setq
a (angle p1 p2)
L (* k (distance p1 p2))
p2 (polar p1 a L)
)
(setvar "osmode" 0)
(command "line" p1 p2 "")
(setvar "osmode" oldos)
(setq p1 p2)
)
(princ)
)
;;;================================================
(defun C:CIK( / k oldos p1 r) ;;;Draw circle with scale k
(PreScale "CircleK")
(setq
p1 (getpoint "\nCenter point:")
r (* k (getdist p1 "\nRadius:"))
)
(setvar "osmode" 0)
(command "circle" p1 r)
(setvar "osmode" oldos)
(princ)
)
;;;================================================
(defun C:RK( / k oldos w h p1 p2) ;;;Draw rectangle with scale k
(PreScale "RectangK")
(setq
w (getreal "\nWidth:")
h (getreal "\nHeight:")
p1 (getpoint "\nBase point:")
p2 (list (+ (car p1) (* k w)) (+ (cadr p1) (* k h)))
)
(setvar "osmode" 0)
(command "rectangle" p1 p2)
(setvar "osmode" oldos)
(princ)
)

;;;================================================
(defun C:CK( / k oldos ss p1 p2 a L) ;;;Copy command with scale k
(PreScale "CopyK")
(setq
ss (ssget)
p1 (getpoint "\nBase point:")
p2 (getpoint p1 "\nSecond point:")
a (angle p1 p2)
L (* k (distance p1 p2))
p2 (polar p1 a L)
)
(setvar "osmode" 0)
(command "copy" ss "" p1 p2)
(setvar "osmode" oldos)
(princ)
)
;;;================================================
(defun C:MK( / k oldos ss p1 p2 a L) ;;;Move command with scale k
(PreScale "MoveK")
(setq
ss (ssget)
p1 (getpoint "\nBase point:")
p2 (getpoint p1 "\nSecond point:")
a (angle p1 p2)
L (* k (distance p1 p2))
p2 (polar p1 a L)
)
(setvar "osmode" 0)
(command "move" ss "" p1 p2)
(setvar "osmode" oldos)
(princ)
)
;;;================================================
(defun C:OK( / k oldos ko) ;;;Offset command with scale k
(PreScale "OffsetK")
(if (not ofd) (setq ofd 10))
(setq ko (getreal (strcat "\nOffset distance <" (rtos ofd) ">:")))
(if (not ko) (setq ko ofd) (setq ofd ko))
(command "offset" (* k ko) pause)
(princ)
)
;;;================================================
(defun C:SK( / p1 p2 ss e p3 p4 a L) ;;;Stretch command with scale k
(PreScale "StretchK")
(setvar "osmode" 0)
(setq
p1 (getpoint "\nSpecify crossing-window... \tFirst corner:")
p2 (getcorner p1 "\nOpposite corner:")
)
(setvar "osmode" oldos)
(setq ss (ssget "c" p1 p2))
(while (setq e (ssname ss 0)) (redraw e 3) (ssdel e ss))
(setq
p3 (getpoint "\nBase point:")
p4 (getpoint p3 "\nSecond point:")
a (angle p3 p4)
L (* k (distance p3 p4))
p4 (polar p3 a L)
)
(setvar "osmode" 0)
(command "stretch" "c" p1 p2 "" p3 p4)
(setvar "osmode" oldos)
(princ)
)
;;;================================================


  • 0

#338 xaydung

xaydung

    biết lệnh trim

  • Members
  • PipPipPip
  • 191 Bài viết
Điểm đánh giá: 12 (tàm tạm)

Đã gửi 23 November 2007 - 11:00 AM

Cho mình xin lisp thay đổi giá trị biến overall scale khi chọn dimmension , và 1 lisp nữa là hiển thị giá trị overall scale khi chọn dim, mong các bác chỉ giúp??!
  • 0

#339 ngayve324

ngayve324

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 515 Bài viết
Điểm đánh giá: 270 (khá)

Đã gửi 23 November 2007 - 04:39 PM

Có cách rồi, chưa giống lắm nhưng xài được:

đúng rồi, xài được nhưng chư giống lắm
Vẫn còn khó dùng.
Thương cho trót luôn bác ssg a`. bác cố gắng làm cho giống mấy thằng LK, MK... thì hay quá
  • 0

#340 xaydung

xaydung

    biết lệnh trim

  • Members
  • PipPipPip
  • 191 Bài viết
Điểm đánh giá: 12 (tàm tạm)

Đã gửi 23 November 2007 - 07:09 PM

Cho mình xin lisp thay đổi giá trị biến overall scale khi chọn dimmension , và 1 lisp nữa là hiển thị giá trị overall scale khi chọn dim, mong các bác chỉ giúp??!
  • 0