Đế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

#1041 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 03 September 2008 - 03:57 PM

Thiệp xin hỏi các cao thủ Lisp: có một đoạn mã nào đưa các lệnh trong Express như Overkill, Layoff hoặc một lệnh tự tạo bằng Lisp vào trong một Lisp khác? Thiệp đang viết 1 Lisp vẽ mặt cắt địa hình, cần hổ trợ lệnh Overkill nhưng không biết cách đưa vào. Xin nhờ các cao thủ chỉ giúp
  • 0

#1042 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 03 September 2008 - 04:18 PM

Thiệp xin hỏi các cao thủ Lisp: có một đoạn mã nào đưa các lệnh trong Express như Overkill, Layoff hoặc một lệnh tự tạo bằng Lisp vào trong một Lisp khác? Thiệp đang viết 1 Lisp vẽ mặt cắt địa hình, cần hổ trợ lệnh Overkill nhưng không biết cách đưa vào. Xin nhờ các cao thủ chỉ giúp

Theo tôi thì muốn đưa 1 lệnh lisp vào 1 lisp khác thì cần cải tạo 1 chút như sau:
Nguyên bản
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;
(Defun C:vtn ( )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;
Sửa lại
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;
(Defun LENHVTN ( )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;
(Defun C:vtn ( )
(LENHVTN))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;


lúc này bạn đem cái (LENHVTN) để vào lisp muốn lồng là được
  • 0

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


#1043 Phiphi.

Phiphi.

    Chưa sử dụng CAD

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

Đã gửi 03 September 2008 - 05:40 PM

Kính nhờ các Bác chỉ giúp cho.
PP đọc cả buổi mà vẩn chưa tìm được đoạn Lisp đang cần.
PP đang lập 1 một số bản vẽ sơ đồ các đường ống nước, gas trước nhà của cả 1 đoạn đường dài. Dựa vào khoảng cách trước mổi nhà để vẽ lại các đ/ố này. Khoảng cách thì khác nhau, mà ví trí điểm chọn trước mỗi nhà cũng không được thẳng hàng. Bản vẽ các line boundary mặt trước nhà đã có sẳn. Bây giờ chỉ cần vẽ các đ/ố và ghi lại khoảng cách như là 1.2B (tức là cách boundary trước nhà 1200mm-bản vẽ dùng đ/v mm) Bên dưới 1.2B sẽ còn ghi thêm độ sâu khác nhau thí dụ như 0.7D (=700mm)
Vẽ trong model với scale thật 1:1 nhưng sẽ dùng layout để in với scale 1:500 trong khổ giấy A1. (Text in ra cao 3.5mm-Text trong model cao 1750mm)
Nhờ các Bác viết giúp cho đoạn Lisp, chỉ cần chọn 1 điểm trước nhà, nhập khoảng cách (mm) thì sẽ vẽ được các line cách điểm chọn (vuông góc). (Nếu như tự động in text bên cạnh như được nhập ban đầu thì rất tốt)
Xin cám ơn trước.

Bạn nên đưa bản vẽ mẫu lên rồi diễn giải trong bản vẽ luôn, như vậy sẽ dễ dàng giúp cho Bạn và người viết code cũng biết được các công đoạn làm như thế nào là tối ưu
@Phiphi: nick này hình như bên kếtcấu.com phải không?

PP xin post hình từ bản vẽ. Các đoạn màu đỏ đã có sẳn chỉ mặt tiền của từng nhà. Chỉ cần vẽ đuờng ống Gas (màu lam) với khoảng cách nhập vào là mm nhưng text ghi là đơn vị mét cho gọn. Xin các Bác giúp nhé. Thanks you very nhiều
http://img122.images...640/lispyi0.jpg
Hình đã gửi
@tien2005. Bác đoán hơi bị đúng đó :lol:
Tối qua nhờ đọc bài của BKIT http://www.ketcau.co...ead.php?p=65032 nên mới biết đến Diễn đàn CADViet rất hay này. PP rất ngưỡng mộ nhiều Bác đã đóng góp rất tích cực cho Diễn đàn CADViet. Thanks you.
  • 0

#1044 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 03 September 2008 - 06:58 PM

PP xin post hình từ bản vẽ. Các đoạn màu đỏ đã có sẳn chỉ mặt tiền của từng nhà. Chỉ cần vẽ đuờng ống Gas (màu lam) với khoảng cách nhập vào là mm nhưng text ghi là đơn vị mét cho gọn. Xin các Bác giúp nhé. Thanks you very nhiều

@tien2005. Bác đoán hơi bị đúng đó :lol:
Tối qua nhờ đọc bài của BKIT http://www.ketcau.co...ead.php?p=65032 nên mới biết đến Diễn đàn CADViet rất hay này. PP rất ngưỡng mộ nhiều Bác đã đóng góp rất tích cực cho Diễn đàn CADViet. Thanks you.

Sao bạn không upload file dwg lên, mọi người sẽ dễ giúp bạn hơn.

Trong file dwg đó, bạn nên vẽ một đoạn vào nhà và điền text sẵn luôn để người giúp bạn có được cấu trúc của text và line.
  • 0

#1045 thangsra

thangsra

    biết vẽ rectang

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

Đã gửi 03 September 2008 - 10:17 PM

Bạn có thể post yêu cầu về autolisp ở topic này.

Em có một yêu cầu là: có rất nhiều dòng text được viết bởi các lệnh dtext, các dòng text này cách đều nhau một khoảng cách nào đó ví là a, bây giờ muốn các dòng text đó cách đều nhau một khoảng là b thì có lisp nào đáp ứng được điều đó ko bác Hoành.
Mong sớm nhận được sự giúp đỡ của các anh em!!
  • 0
It`s me !!

#1046 Phiphi.

Phiphi.

    Chưa sử dụng CAD

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

Đã gửi 03 September 2008 - 10:27 PM

Sao bạn không upload file dwg lên, mọi người sẽ dễ giúp bạn hơn.

Trong file dwg đó, bạn nên vẽ một đoạn vào nhà và điền text sẵn luôn để người giúp bạn có được cấu trúc của text và line.

Rất cám ơn Bác Nguyen Hoang quan tâm giúp đở.
PP xin gởi bản vẽ và file số liệu dùng để lập sơ đồ đ/ống này: http://www.cadviet.c...ong_ong_Gas.zip
  • 0

#1047 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 03 September 2008 - 10:45 PM

Em có một yêu cầu là: có rất nhiều dòng text được viết bởi các lệnh dtext, các dòng text này cách đều nhau một khoảng cách nào đó ví là a, bây giờ muốn các dòng text đó cách đều nhau một khoảng là b thì có lisp nào đáp ứng được điều đó ko bác Hoành.
Mong sớm nhận được sự giúp đỡ của các anh em!!

Tôi thường xuyên gặp phải vấn đề tương tự bạn, tôi làm như sau:
- Copy 1 text ra làm gốc, để dành đó.
- Scale cụm còn lại với tỷ lệ b/a.
- Matchprop text gốc với các text vừa scale.
- Xoá text gốc.

Thao tác trên đơn giản tới mức tôi không bao giờ dùng lisp để thực hiện vì để appload lisp + nhớ tên lệnh lisp khó khăn hơn việc thủ công trên.
  • 0

#1048 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 03 September 2008 - 11:22 PM

Rất cám ơn Bác Nguyen Hoang quan tâm giúp đở.
PP xin gởi bản vẽ và file số liệu dùng để lập sơ đồ đ/ống này: http://www.cadviet.c...ong_ong_Gas.zip


Cảm ơn bạn vì một yêu cầu rất mạch lạc, dưới đây là lisp của bạn:

(defun c:xd ()
(setq sel (entsel "\nHay pick mot diem thuoc mat tien nha: "))
(if (or (not sel)
(/= "LINE" (cdr (assoc 0 (entget (car sel)))))
)
(alert
"Ban chon khong dung\nHay pick vao mot doi tuong LINE"
)
(progn
(setq
ent (car sel)
p1 (cdr (assoc 10 (entget ent)))
phuong (trans (getpoint (cadr sel) "\nHay pick huong dat chu: ")
1
0
)
B_ (getreal "\mB (m): ")
D_ (getstring "\mD (m): ")
p (vlax-curve-getClosestPointTo ent (trans (cadr sel) 1 0))

)
(changegeo p p1 phuong)
(setq ptextB_ (trans (list 0.0 1500.0 0.0) 1 0)
ptextD_ (trans (list -2500.0 1500.0 0.0) 1 0)
pPoint (trans (list 0.0 (* -1000.0 B_) 0.0) 1 0)
)
(restoregeo)
(ctext ptextB_ (strcat (rtos B_ 2 1) "B"))
(ctext ptextD_ (strcat D_ "D"))
(cpoint pPoint)
)
)
)
(defun ctext (p gt)
(entmake (list
(cons 0 "TEXT")
(cons 8 "G_text35")
(cons 40 1750.0)
(cons 50 0.0)
(cons 7 "ISOCP")
(cons 10 p)
(cons 1 gt)
)
)
)
(defun cPoint (p)
(entmake (list
(cons 0 "POINT")
(cons 10 p)
)
)
)
(defun changegeo (p p1 phuong)
(setq cv_oldos (getvar "osmode"))
(setvar "osmode" 0)
(command ".ucs" "w")
(command ".ucs" "3" p p1 phuong)
)
(defun restoregeo ()
(command ".ucs" "p")
(command ".ucs" "p")
(setvar "osmode" cv_oldos)
(setq cv_oldos nil)
)

Lệnh XD sẽ yêu cầu bạn:
- pick vào 1 điểm thuộc mặt tiền nhà,
- sau đó yêu cầu bạn pick vào phía có ghi chữ (ngược lại phía với ống),
- sau đó nhập B và D (theo đơn vị m).

Khi bạn nhập xong, Chương trình sẽ cho bạn:
- Text B, D
- Point điểm tọa độ.

Từ đây bạn phải vẽ đường ống bằng cách nối line từ point đến point một cách thủ công. Nếu bạn lười, hãy dùng lisp JP (Joint Point) đã có trên diễn đàn (bạn hãy search nhé) để joint các point lại với nhau.
  • 0

#1049 quangagf

quangagf

    biết zoom

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

Đã gửi 04 September 2008 - 08:51 AM

nhờ các ban tìm giúp có lisp nào thống kê block khi ta chọn 1 vùng trước khg, và tính tổng chiều dài các line, pline ... mà ta chọn khg. Mình là dân điện, đang muốn tìm lisp thống kê vật tư điện trên bảng vẽ CAD. Đa tạ :lol:
  • 0

#1050 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 04 September 2008 - 08:16 PM

nhờ các ban tìm giúp có lisp nào thống kê block khi ta chọn 1 vùng trước khg, và tính tổng chiều dài các line, pline ... mà ta chọn khg. Mình là dân điện, đang muốn tìm lisp thống kê vật tư điện trên bảng vẽ CAD. Đa tạ :lol:

Nếu tính tổng các block thì chỉ cần Ctrl +1 nếu là cad 2008 trở lên thì nó đã đếm cho cậu rồi. Còn tính tổng chiều dài thì đây. http://www.cadviet.c...hchieudaidt.lsp . Phải dùng chức năng tìm kiếm chứ
  • 0

#1051 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 04 September 2008 - 08:26 PM

Cảm ơn bạn vì một yêu cầu rất mạch lạc, dưới đây là lisp của bạn:
...

Lệnh XD sẽ yêu cầu bạn:
- pick vào 1 điểm thuộc mặt tiền nhà,
- sau đó yêu cầu bạn pick vào phía có ghi chữ (ngược lại phía với ống),
- sau đó nhập B và D (theo đơn vị m).

Khi bạn nhập xong, Chương trình sẽ cho bạn:
- Text B, D
- Point điểm tọa độ.

Từ đây bạn phải vẽ đường ống bằng cách nối line từ point đến point một cách thủ công. Nếu bạn lười, hãy dùng lisp JP (Joint Point) đã có trên diễn đàn (bạn hãy search nhé) để joint các point lại với nhau.

Thành thật cám ơn Bác Nguyen Hoanh đã viết giúp cho PP LISP trên.
Sáng nay ở cty, PP đã chuyển qua file, dùng AutoCad 2006 để sử dụng thử qua thì thấy LISP Bác viết đã đáp ứng được yêu cầu. Vì không đăng nhập vào forum lúc đó để nói lời cảm tạ Bác được do lổi kỷ thuật nào đó, tối nay vê nhà cũng không vào được nên đành đăng ký nick mới với email mới.
Nhớ lại sáng nay mới chỉ xài sơ qua, PP thấy lúc vẽ bên phía tay trái lề đường, text mB/mD bị chồng lên line boundary, PP phải dùng lệnh Move để dời lại text.
Ngoài ra Bác có cách nào để khỏi nối line từ point đến point một cách thủ công or dùng lệnh Joint Point (PP chưa search ra nhưng chằc cũng sẽ tìm được)
Nếu như ban đầu dùng lệnh Line> pick 1 điểm gần đúng> pick điểm 2 bằng Nearest snap trên line boundary> nhập khoảng cách> ta có ngay line đường ống Gas cách điểm 2 như đã input, sao đó nhập thêm text mD là xong. Rồi tiếp tục vẽ đến hết giờ tan ca...
Tối nay định dùng PC ở nhà thực tập lại, nhưng lại bị báo lỗi như sau:
Command: _appload XD.lsp successfully loaded.
Command:
Command: XD
Hay pick mot diem thuoc mat tien nha:
Hay pick huong dat chu: 2000
mB (m): 2
mD (m): 1
; error: no function definition: VLAX-CURVE-GETCLOSESTPOINTTO
Command:

PP xin được nói rõ thêm:
+ Cty xài AutoCAD 2006, còn ở nhà là 2008
+ File LISP làm ở cty không save đem về nhà, tối này mới down và làm lại (PP post lại, nhờ Bác check giúp)
http://www.cadviet.com/upfiles/XD.lsp
Thật ra LISP Bác viết tặng như trên là PP rất happy lắm rồi. Nếu Bác không ngại thì PP xin được phép liên lạc với Bác qua email sau. Đây là email của PP: TranH@pbworld.com
Your help is greatly appreciated.
  • 0

#1052 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 04 September 2008 - 10:58 PM

Tối nay định dùng PC ở nhà thực tập lại, nhưng lại bị báo lỗi như sau:
[i]Command: _appload XD.lsp successfully loaded.
Command:
Command: XD
Hay pick mot diem thuoc mat tien nha:
Hay pick huong dat chu: 2000
mB (m): 2
mD (m): 1
; error: no function definition: VLAX-CURVE-GETCLOSESTPOINTTO

Xin 'hồi đáp' từng vấn đề của bạn như sau:
- Về text bị lệnh, đây cũng là một kinh nghiệm, do bạn chỉ upload file có text 1 bên, nên tôi cũng chỉ test có một bên. Nếu bạn muốn cải tiến, hãy upload 1 file có đầy đủ text ở hai bên.
- Về khỏi nối point một cách thủ công thì ngoài JP ra tôi chưa tìm được cách nào khác.
- Về lỗi no function definition là bất ngờ với tôi, vì thường các acad > 2000 mới đều có hàm VLAX-CURVE-GETCLOSESTPOINTTO. bạn thử thêm vào cuối file lisp mã lệnh (vl-load-com) xem có cải thiện được không, nếu vẫn không được thì đành bó tay.
- Về email riêng, tôi rất muốn mọi thứ được trao đổi trên diễn đàn, vì 2 lý do: nhiều người khác nữa giống bạn sẽ không phải viết lại yêu cầu mà dùng luôn file lisp của bạn, nhiều người khác nữa giống tôi sẽ giúp được bạn tốt hơn tôi đã giúp bạn.
  • 0

#1053 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 05 September 2008 - 07:12 AM

Xin 'hồi đáp' từng vấn đề của bạn như sau:
- Về text bị lệnh, đây cũng là một kinh nghiệm, do bạn chỉ upload file có text 1 bên, nên tôi cũng chỉ test có một bên. Nếu bạn muốn cải tiến, hãy upload 1 file có đầy đủ text ở hai bên.
- Về khỏi nối point một cách thủ công thì ngoài JP ra tôi chưa tìm được cách nào khác.
- Về lỗi no function definition là bất ngờ với tôi, vì thường các acad > 2000 mới đều có hàm VLAX-CURVE-GETCLOSESTPOINTTO. bạn thử thêm vào cuối file lisp mã lệnh (vl-load-com) xem có cải thiện được không, nếu vẫn không được thì đành bó tay.
- Về email riêng, tôi rất muốn mọi thứ được trao đổi trên diễn đàn, vì 2 lý do: nhiều người khác nữa giống bạn sẽ không phải viết lại yêu cầu mà dùng luôn file lisp của bạn, nhiều người khác nữa giống tôi sẽ giúp được bạn tốt hơn tôi đã giúp bạn.


Đây là 1 bản vẽ cũ, làm rất thủ công.
http://www.cadviet.c...old_file__1.zip
Cách đã vẽ như sau:
+ Vẽ 1 line = khoảng cách
+ Vẽ đường ống gas = cách nối các end point lại
+ Insert block B-D rồi đặt text mB/mD
Trong bài trước #1044, PP có post hình vẽ đ/ô 2 bên đường.
Việc xin email riêng là chỉ dùng để làm quen, trao đổi những việc khác thôi Bác Hoành ạ.
Cám ơn Bác nhiều lắm.
  • 0

#1054 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 06 September 2008 - 10:18 AM

Theo tôi thì muốn đưa 1 lệnh lisp vào 1 lisp khác thì cần cải tạo 1 chút như sau:
Nguyên bản
(Defun C:vtn ( )

;;;;;;;;;;;;;;;
Sửa lại
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(Defun LENHVTN ( )
;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;
(Defun C:vtn ( )
(LENHVTN))
;;;;;;;;;;;;;;;

lúc này bạn đem cái (LENHVTN) để vào lisp muốn lồng là được

Làm theo cách này cũng tạm được, nhưng lisp trong Express rất lớn, copy qua sửa lại rất phức tạp. Không biết có ai có cách nào khác không?
  • 0

#1055 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 06 September 2008 - 01:00 PM

Làm theo cách này cũng tạm được, nhưng lisp trong Express rất lớn, copy qua sửa lại rất phức tạp. Không biết có ai có cách nào khác không?


Ví dụ tôi có file Can dong text deu nhau.VLX ở ổ C -> đường dẫn file là "C:/Can dong text deu nhau.VLX" với lệnh chạy lisp này là DDT chẳng hạn.
Tôi muốn chạy file này ( tức chạy lệnh DDT) trong một file lisp khác ( lệnh của lisp này chẳng hạn là VD) tôi phải có dòng lệnh như sau:

(defun C:VD ()
(vl-load-all "C:/Can dong text deu nhau.VLX") -> load lisp với lệnh DDT.
(C:DDT) -> giống như đánh lệnh DDT trên command
)

  • 0

#1056 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 06 September 2008 - 01:49 PM

Cảm ơn Nacata, tôi đã làm được rồi.
Như vậy tôi sẽ hoàn thiện 1 Lisp vẽ mặt cắt ngang, (dọc) cắt qua một bình đồ với các đường contuor là "LWPOLYLINE" có độ cao. Trước đây, tôi phải làm thành 2 lisp, trong đó có lệnh "overkill" là lệnh trung gian giữa 2 lisp này. Tôi sẽ gửi lisp "matcat.lsp" lên diễn đàn sau khi hoàn thành.
  • 0

#1057 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 06 September 2008 - 01:54 PM

Ồ xin lỗi phải là Nataca mới đúng tên. Xin THANK Nataca một lần nữa.
  • 0

#1058 khuduba

khuduba

    biết vẽ pline

  • Members
  • PipPip
  • 63 Bài viết
Điểm đánh giá: 24 (tàm tạm)

Đã gửi 06 September 2008 - 02:10 PM

Chào các Mems, Tôi muốn có một đoạn lisp mà biến nhiều đoạn pline thành đúng một pline duy nhất.

Mong được giúp đỡ.

Thanks

Mình cũng đã tìm đến đoạn lisp của SSG, nhưng hình như nó không đúng ý mình (đã chạy thử)


;;;***********************************************************
;;;CONVERT TO PLINES PROGRAM WITH FULL COMMENTS!
;;;Convert all objects: Line, Pline, Spline, Arc, Circle, Ellipse_
;;;to Plines. Length of 1 segment is specified by user
;;;Copy & Paste to Notepad, Saveas *.lsp, Appload then Type C2P to run
;;;Happy New Year 2008!
;;;Written by ssg - January 2008 - www.cadviet.com
;;;***********************************************************

;;;-------------------------------------------------------------
(defun makepl ( e d1 / ps pe d d2 p2);;;Make pline along curve e. Length of 1 segment = d1
(vl-load-com);;;Load Visual LISP extensions before use vlax-xxxx functions
(setq
ps (vlax-curve-getStartPoint e);;;Start point
pe (vlax-curve-getEndPoint e);;;End point
d (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e));;;Length of curve e
d2 d1;;;Init variable distance
)
(command "pline");;;Call pline command
(command ps);;;Start point
(while (<= d2 d);;;While not over end point pe
(setq p2 (vlax-curve-getPointAtDist e d2));;;Variable point at d2 = length along curve
(command p2);;;Continue pline command from current point to p2
(setq d2 (+ d2 d1));;;Increase distance d2 by d1
);;;End while
(command pe "");;;Pline to pe and finish command
)
;;;-------------------------------------------------------------
(defun C:C2P( / d1 ss oldos i e ans);;;Convert to Plines
(if (not d0) (setq d0 0.5));;;Init dividual distance, global variable
(setq d1 (getreal (strcat "\nLength of 1 segment <" (rtos d0) ">:")));;;Input distance
(if d1 (setq d0 d1) (setq d1 d0));;;Reset or get distance
(setq
ss (ssget '((0 . "LINE,LWPOLYLINE,SPLINE,ARC,CIRCLE,ELLIPSE")));;;Selection set
oldos (getvar "osmode");;;Save osmode
i 0;;;Init counter
)
(setvar "osmode" 0);;;Disable osmode
(repeat (sslength ss);;;Repeat for all entities in ss
(setq e (ssname ss i));;;Set e for entity with ordinal i in selection set ss
(makepl e d1);;;Use makepl function. Make pline along e
(setq i (1+ i));;;Increase counter
)
(initget "Y N");;;Init keywords
(setq ans (getkword "\nDelete source objects? [Yes/No] :"));;;Get answer from user
(if (= ans "Y") (command "erase" ss ""));;;Erase source objects if ans = "y" or "Y"
(setvar "osmode" oldos);;;Reset osmode
(princ);;;Silent quit
)
;;;-------------------------------------------------------------

  • 0

#1059 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 06 September 2008 - 02:30 PM

Chào các Mems, Tôi muốn có một đoạn lisp mà biến nhiều đoạn pline thành đúng một pline duy nhất.

Lisp trên có công dụng khác: convert các đối tượng khác (như liệt kê) thành pline.
Lisp theo ý diễn tả của bạn là đây:

(defun C:JPL(/ ss e)
(setq
ss (ssget '((0 . "LWPOLYLINE")))
e (ssname ss 0)
)
(if e (command "pedit" e "j" "all" "" ""))
)

  • 0

#1060 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 06 September 2008 - 08:31 PM

Đây là 1 bản vẽ cũ, làm rất thủ công.
http://www.cadviet.c...old_file__1.zip
Cách đã vẽ như sau:
+ Vẽ 1 line = khoảng cách
+ Vẽ đường ống gas = cách nối các end point lại
+ Insert block B-D rồi đặt text mB/mD
Trong bài trước #1044, PP có post hình vẽ đ/ô 2 bên đường.
Việc xin email riêng là chỉ dùng để làm quen, trao đổi những việc khác thôi Bác Hoành ạ.
Cám ơn Bác nhiều lắm.

file lisp dưới đây đã cải tiến, sẽ dùng được với cả hai bên, với điều kiện là bạn phải dùng block "B-D" mà tôi đã move text vào tâm.
file dwg có chứa block "B-D" đã sửa đổi: http://www.cadviet.c...pfiles/bvdo.zip

(defun c:xd ()
(setq sel (entsel "\nHay pick mot diem thuoc mat tien nha: "))
(if (or (not sel)
(/= "LINE" (cdr (assoc 0 (entget (car sel)))))
)
(alert
"Ban chon khong dung\nHay pick vao mot doi tuong LINE"
)
(progn
(setq
ent (car sel)
p1 (cdr (assoc 10 (entget ent)))
phuong (trans (getpoint (cadr sel) "\nHay pick huong dat chu: ")
1
0
)
B_ (getreal "\mB (m): ")
D_ (getstring "\mD (m): ")
p (vlax-curve-getClosestPointTo ent (trans (cadr sel) 1 0))

)
(saveos)
(changegeo p p1 phuong)
(setq pI_ (trans (list 0.0 4300.0 0.0) 1 0)
pPoint (trans (list 0.0 (* -1000.0 B_) 0.0) 1 0)
)
(restoregeo)
(command ".insert"
"B-D"
(trans pI_ 0 1)
1.0
1.0
0.0
(strcat (rtos B_ 2 1) "B")
(strcat D_ "D")
)
(cpoint pPoint)
(restoreos)
)
)
)
(defun cPoint (p)
(entmake (list
(cons 0 "POINT")
(cons 10 p)
)
)
)
(defun saveos ()
(setq cv_oldos (getvar "osmode"))
(setvar "osmode" 0)
)
(defun restoreos ()
(setvar "osmode" cv_oldos)
(setq cv_oldos nil)
)
(defun changegeo (p p1 phuong)
(command ".ucs" "w")
(command ".ucs" "3" p p1 phuong)
)
(defun restoregeo ()
(command ".ucs" "p")
(command ".ucs" "p")
)


email của tôi là: nguyenhoanh@cadviet.com
  • 0