Đến nội dung


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

Viết lisp theo yêu cầu [phần 2]


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

#861 svba1608

svba1608

    Tưởng Thị Tú Khuyên

  • Moderator
  • PipPipPipPipPipPipPip
  • 601 Bài viết
Điểm đánh giá: 620 (tốt)

Đã gửi 11 March 2010 - 09:16 AM

Chào Svba1608,
Hy vọng rằng cái này đúng ý bạn
Lệnh chạy lisp là gkc
Chúc bạn vui.


Cảm ơn bác Bình nhiều! Lisp chạy đúng ý em! Nhờ bác check lại giùm lisp một chút, vì khi chạy lisp không hiểu sao tất cả các truy bắt điểm (trong lệnh Osnap) đều bị mất, khiến cho em không thể pick vào được điểm cần pick.
Nhờ bác và các anh chị em sửa thêm cho lisp một chút. Ấy là lúc trước em quên mất rằng những đối tượng em cần đo chiều dài không chỉ có đoạn thẳng mà có nhiều đường gấp khúc (vẽ bằng lệnh pline). Nay em muốn cải tiến lisp như sau:
Lisp đo chiều dài đối tượng bằng cách pick nhiều điểm trên đối tượng cho đến khi enter (hay làm động tác gì đó) để kết thúc việc chọn điểm trên đối tượng. Hoặc nếu có thể, xin cho lisp thêm chức năng ghi chiều dài của pline được chọn (vẫn lập thành bảng).
Xin mô tả ý muốn của mình như sau:
Em cần đo chiều dài nhiều đoạn ống và lập bảng. Trong đó có đoạn ống 17-18 và 18-21 như hình ảnh minh họa.
Thực chất đây là các đoạn polyline gãy khúc. Vì vậy em muốn đo chiều dài theo 2 cách: pick chọn polyline và pick chọn điểm.
Rất mong nhận được sự giúp đỡ! Em xin chân thành cảm ơn!
Hình đã gửi
  • 0
http://khuyen.space

#862 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 11 March 2010 - 09:21 AM

Chào Svba1608,
Hy vọng rằng cái này đúng ý bạn
http://www.cadviet.c...iles/2/svba.lsp


(defun c:gkc ()
(defun wtxt (txt p / sty d h)
(entmake
(list (cons 0 "TEXT")
(cons 1 txt)
(cons 10 p)
(cons 40 20)
)
)
)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq p (getpoint "\n Hay chon diem dat bang")
cnt 0
h 30)
(setq ans (getstring "\n Ban muom tiep tuc: [y or n] "))
(while (= ans "y")
(setq kc (rtos (getdist) 2 2)
pt (list (car p) (- (cadr p) (* cnt h))))
(wtxt kc pt)
(setq cnt (1+ cnt)
ans (getstring "\n Ban muom tiep tuc: [y or n] "))
)
(setvar "osmode" oldos)
(princ)
)

Lệnh chạy lisp là gkc
Chúc bạn vui.

Chào bác PhamthanhBinh

1. Tue_NV biết bác tắt chế độ bắt điểm để ghi Text cho đúng, nhưng bác nên cho 1 đoạn mã bật chế độ bắt điểm khi nhập khoảng cách bằng hàm (getdist)
(setvar "osmode" 0)

2. (setq ans (getstring "\n Ban muom tiep tuc: [y or n] "))
(dòng này trên dòng (while (= ans "y")
--->> Theo Tue_NV bác nên thay dòng này bằng dòng (setq ans "y")
Dạo đầu mà bác, đương nhiên là muốn tiếp tục rồi :cheers: :cheers:

3. Nên cho 1 vòng lặp while lồng vào vòng lặp (while (= ans "y") ...... ---> lặp lại hành động nhập khoảng cách để cho đúng như ý muốn của svba1608 ở bài viết trên, để tăng nhanh hiệu quả làm việc của Lisp

Mình cũng vừa mới đọc bài của svba1608 ở trên thì ý thứ 3 mình nên đưa vào để USER có 2 lựa chọn :
a./ Nhập chiều dài bằng cách chọn đối tượng
b/ Nhập chiều dài bằng cách pick điểm
  • 2

#863 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 11 March 2010 - 10:38 AM

Chào bác PhamthanhBinh

1. Tue_NV biết bác tắt chế độ bắt điểm để ghi Text cho đúng, nhưng bác nên cho 1 đoạn mã bật chế độ bắt điểm khi nhập khoảng cách bằng hàm (getdist)
(setvar "osmode" 0)

2. (setq ans (getstring "\n Ban muom tiep tuc: [y or n] "))
(dòng này trên dòng (while (= ans "y")
--->> Theo Tue_NV bác nên thay dòng này bằng dòng (setq ans "y")
Dạo đầu mà bác, đương nhiên là muốn tiếp tục rồi :cheers: :cheers:

3. Nên cho 1 vòng lặp while lồng vào vòng lặp (while (= ans "y") ...... ---> lặp lại hành động nhập khoảng cách để cho đúng như ý muốn của svba1608 ở bài viết trên, để tăng nhanh hiệu quả làm việc của Lisp

Mình cũng vừa mới đọc bài của svba1608 ở trên thì ý thứ 3 mình nên đưa vào để USER có 2 lựa chọn :
a./ Nhập chiều dài bằng cách chọn đối tượng
b/ Nhập chiều dài bằng cách pick điểm

Chào bác Tue_nv và bạn svba1608,
Ý 1 và 2 của bác, mình nhất trí, song có điều sau khi nhập khoảng cách lại phải đặt chế độ osnap về 0.
Ý 3 của bác mình chưa hiểu rõ, nếu là để thực hiện yêu cầu cho phép hai kiểu nhập khoảng cách khác nhau nhừ bạn svba đề nghị thì theo mình có thể dùng hàm điều kiện if sẽ hay hơn bác ạ.
Gửi bác và bạn SVBA1608 cái lisp mình đã sửa theo ý như trên. Mong rằng nó giúp ích được cho bạn SVBA1608.

(defun c:gkc ()
(vl-load-com)
(defun wtxt (txt p / sty d h)
(entmake
(list (cons 0 "TEXT")
(cons 1 txt)
(cons 10 p)
(cons 40 20)
)
)
)
(defun Length(e) (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e)))
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq p (getpoint "\n Hay chon diem dat bang")
cnt 0
h 30)
(setq ans "y")
(while (= ans "y")
(setq pt (list (car p) (- (cadr p) (* cnt h))))
(setq a (getstring "\n Hay chon kieu nhap : [1 or 2] "))
(if (= a "1")
(progn
(setvar "osmode" oldos)
(setq kc (rtos (getdist) 2 2))
(setvar "osmode" 0)
)
(progn
(setq ent (entsel)
e (car ent)
kc (rtos (length e) 2 2))
)
)
(wtxt kc pt)
(setq cnt (1+ cnt)
ans (getstring "\n Ban muom tiep tuc: [y or n] "))
)
(setvar "osmode" oldos)
(princ)
)

Cách dùng tương tự lisp trước nhưng lưu ý khi lisp hỏi kiểu nhập khoảng cách, "1" là kiểu nhập bằng pick hai điểm, "2" là kiểu nhập bằng cách chọn đối tượng.
Do chỉ có hai kiểu nhập nên nếu chọn kiểu 2 bạn có thể nhấn enter ngay khi lisp hỏi mà không cần thiết phải nhập ký tự 2. Nhưng nếu muốn nhập kiểu 1 thì bắt buộc phải nhập ký tự 1 trước khi nhấn enter.
Chúc mọi người luôn mạnh giỏi và yêu đời.
@ SVBA1608: Cái lisp ghi diện tích vào ngay trong bản vẽ mình vẫn chưa gỡ được vì không hiểu tại sao nó lại cho kết quả khác với khi lập bảng. Mong bạn thông cảm. Hy vọng diễn đàn sẽ có người gỡ giúp cái xơ to tổ bố này. Hề hề hề, đau răng quá.....
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#864 thiep

thiep

    biết dimbaseline

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

Đã gửi 11 March 2010 - 12:40 PM

Tuy nhiên, em xin dừng đề nghị này vì em thấy nó là không khả thi.

Chào svba1608, và bác phanthanhbinh, Đề toán ra lần này có khó hơn đề toán trước, nhưng vẫn có khả thi giải được bài toán này! Thiep gợi ý như thế này:
- Từng đoạn ống, xác định được text số đầu ống ví dụ 29-28, tuy nhiên muốn đúng theo hướng dòng chảy thì hướng của polyline (ống) phải cùng hướng mũi tên dòng chảy (startpoint tại text 29, endpoint tại text 28)
- Từng đoạn ống sẽ tìm được điểm giữa, từ điểm giữa tìm được 2 đường ranh thửa (màu số 153) gần nó nhất, gọi là đường LWP.
- Từng LWP lọc lấy các point nút đỉnh cho vào 1 listpoint để lọc lấy các text A, B, C, D, E và 1 text số (dùng mã hàm (ssget “CP” listpoint ‘((0 . “TEXT”)))
- Từng các text A, B, C, D sẽ tìm được insertpoint và tìm được khoảng cách từ text đến LWP. So sánh để tìm ra 1 text chữ gần LWP nhất. Nối với text số để tạo nhãn của tiểu khu.
Tuy nhiên, trong bản vẽ của svba1608 có 1 đường ống rất dài từ điểm 18 -> 21 -> 25 -> 31 -> 30, không xử lý được, cần phải cắt ra 4 đoạn mới làm được.
Vài điều trao đổi với các bác, Lúc rày Thiep đang bận lắm, muốn ra lisp này nhưng đành chịu, nhờ các bác nào rảnh tay giúp svba1608 với.
  • 2

#865 svba1608

svba1608

    Tưởng Thị Tú Khuyên

  • Moderator
  • PipPipPipPipPipPipPip
  • 601 Bài viết
Điểm đánh giá: 620 (tốt)

Đã gửi 11 March 2010 - 03:16 PM

Chào bác Tue_nv và bạn svba1608,
Ý 1 và 2 của bác, mình nhất trí, song có điều sau khi nhập khoảng cách lại phải đặt chế độ osnap về 0.
Ý 3 của bác mình chưa hiểu rõ, nếu là để thực hiện yêu cầu cho phép hai kiểu nhập khoảng cách khác nhau nhừ bạn svba đề nghị thì theo mình có thể dùng hàm điều kiện if sẽ hay hơn bác ạ.


Hình đã gửi

Cảm ơn bác Bình rất nhiều! Tuy nhiên em muốn nhờ thay đổi chức năng của lisp: kiểu 2 vẫn là pick chọn polyline, nhưng kiểu 1 là pick chọn nhiều điểm trên đối tượng chứ không phải 2 điểm.
Xin giải thích lý do phải pick chọn nhiều điểm như sau:
Đoạn ống 17 - 18 nếu đúng ra thì nút 17 phải gần nút 20. Nhưng do yêu cầu của việc thiết kế HTTN mà phải tách ra, nhưng khi tính chiều dài đoạn ống 17-18, người thiết kế phải tính chiều dài đoạn gấp khúc 20-18 chứ không phải 17-18. Như vậy lúc này em dùng kiểu 1: pick 2 điểm hay kiểu 2: pick chọn polyline đều không chính xác.
Vì vậy nhờ các bác sửa lisp giùm em thành pick chọn nhiều điểm.

@ SVBA1608: Cái lisp ghi diện tích vào ngay trong bản vẽ mình vẫn chưa gỡ được vì không hiểu tại sao nó lại cho kết quả khác với khi lập bảng. Mong bạn thông cảm. Hy vọng diễn đàn sẽ có người gỡ giúp cái xơ to tổ bố này. Hề hề hề, đau răng quá.....

Cảm ơn bác Bình, với svba1608, lisp này là quá tuyệt vời, và nhờ sự giúp đỡ của mọi người, svba1608 đã hoàn thành xong việc tính diện tích rồi.

Chào svba1608, và bác phanthanhbinh, Đề toán ra lần này có khó hơn đề toán trước, nhưng vẫn có khả thi giải được bài toán này!

Rất cảm ơn sự giúp đỡ của anh Thiệp.
  • 0
http://khuyen.space

#866 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 11 March 2010 - 04:47 PM

Hình đã gửi

Cảm ơn bác Bình rất nhiều! Tuy nhiên em muốn nhờ thay đổi chức năng của lisp: kiểu 2 vẫn là pick chọn polyline, nhưng kiểu 1 là pick chọn nhiều điểm trên đối tượng chứ không phải 2 điểm.
Xin giải thích lý do phải pick chọn nhiều điểm như sau:
Đoạn ống 17 - 18 nếu đúng ra thì nút 17 phải gần nút 20. Nhưng do yêu cầu của việc thiết kế HTTN mà phải tách ra, nhưng khi tính chiều dài đoạn ống 17-18, người thiết kế phải tính chiều dài đoạn gấp khúc 20-18 chứ không phải 17-18. Như vậy lúc này em dùng kiểu 1: pick 2 điểm hay kiểu 2: pick chọn polyline đều không chính xác.
Vì vậy nhờ các bác sửa lisp giùm em thành pick chọn nhiều điểm.
Cảm ơn bác Bình, với svba1608, lisp này là quá tuyệt vời, và nhờ sự giúp đỡ của mọi người, svba1608 đã hoàn thành xong việc tính diện tích rồi.
Rất cảm ơn sự giúp đỡ của anh Thiệp.

Chào bạn SVBA1608,
Cái lisp này mình đã sửa lại theo ý bạn. Bạn thử dùng xem nhé. Nó có hai kiểu chọn là pick nhiều điểm và pick đối tượng. Tất nhiên khi pick nhiều điểm thì nó hơi nhiêu khê hơn pick hai điểm. Nó yêu cầu bạn phải trả lời có chọn điểm tiếp theo hay không. Nếu bạn không chọn tiếp nó sẽ tính tổng khoảng cách từ điểm đầu lần lượt qua các điểm chọn tới điểm cuối cùng mà bạn đã chọn.
Nó đây nè:

(defun c:gkc ()
(vl-load-com)
(defun wtxt (txt p / sty d h)
(entmake
(list (cons 0 "TEXT")
(cons 1 txt)
(cons 10 p)
(cons 40 20)
)
)
)
(defun Length(e) (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e)))
(defun tkc ()
(setq kc 0
p0 (getpoint "\n Hay chon diem dau")
as "y")
(while (= as "y")
(setq kc (+ kc (distance p0 (setq p1 (getpoint))))
p0 p1
as (getstring "\n Ban muon chon diem tiep theo: [y or n] ")
)
)
;;; (setq kc (rtos kc 2 2))
kc
)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq p (getpoint "\n Hay chon diem dat bang")
cnt 0
h 30)
(setq ans "y")
(while (= ans "y")
(setq pt (list (car p) (- (cadr p) (* cnt h))))
(setq a (getstring "\n Hay chon kieu nhap : [1 or 2] "))
(if (= a "1")
(progn
(setvar "osmode" oldos)
(setq kc (rtos (tkc) 2 2))
(setvar "osmode" 0)
)
(progn
(setq ent (entsel)
e (car ent)
kc (rtos (length e) 2 2))
)
)
(wtxt kc pt)
(setq cnt (1+ cnt)
ans (getstring "\n Ban muom tiep tuc: [y or n] "))
)
(setvar "osmode" oldos)
(princ)
)


Bạn có thể so sánh cái lisp này với các lisp trước đó để thấy được cái cách mình sửa. Qua đó bạn có thể học được cách sửa lisp theo ý mình.
Chúc bạn vui.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#867 nqt266

nqt266

    biết vẽ circle

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

Đã gửi 12 March 2010 - 01:40 AM

TUE_NV ah, lần trước mình nhờ anh em trên diễn đàn giúp mình về lisp rải taluy, sau đó mình nhận đc lisp của bạn, tuy nhiên bây giờ sử dụng lại nảy sinh ra một vấn đề , đó là khi rải taluy, nếu đường cơ sở (chọn đường thứ nhất) mà là đường gãy khúc hoặc là đường cong thì các đường taluy sẽ chồng chéo lên nhau,mình lải phải trim đi, vẽ lại.Nếu như nét Taluy mà vuông góc vơi đường chọn thứ 2 thì coi như giải quyết được vấn đề. Vậy việc này nhờ TUE_NV và anh em trên diễn đàn cùng thảo luận, giải quyết giúp mình với nhé. Mình up file minh hoạ ở đây:
http://www.cadviet.c.../minh_hoa_1.dwg
Và lisp mình up lai ở đây
http://www.cadviet.c...files/2/mtl.lsp
Xin chân thành cảm ơn bạn và anh em trên diễn đàn!
  • 0

#868 nqt266

nqt266

    biết vẽ circle

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

Đã gửi 12 March 2010 - 03:18 PM

Anh em trên diễn đàn bớt chút thời gian xem xét và giải quyết vướng mắc về lisp "mtl" trên của em với, em đang cần quá.
Xin chân thành cảm ơn!!!
  • 0

#869 thiep

thiep

    biết dimbaseline

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

Đã gửi 12 March 2010 - 03:38 PM

Anh em trên diễn đàn bớt chút thời gian xem xét và giải quyết vướng mắc về lisp "mtl" trên của em với, em đang cần quá.
Xin chân thành cảm ơn!!!

Chào nqt266, gì mà cần gấp quá dậy! Lisp này, Thiep viết đã lâu, bạn thử lisp này xem. Lệnh là TLU
http://www.cadviet.c...les/2/taluy.lsp
Chúc bạn thành công
  • 1

#870 ducboss

ducboss

    biết vẽ line

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

Đã gửi 12 March 2010 - 05:29 PM

Tuynh:
Mình đưa file lên đây
http://www.cadviet.c...iles/2/2d3d.dwg
đường 2d poline có cao độ là 10, đường 3d poline có cao độ khác nhau tại các điểm point, bạn có lisp nào mà khi pick vào đường
2d poline thì tại các điểm point hiện cao độ cho mình nhập theo ý muốn và đường 2d poline chuyển thành 3d poline.

Chào Tuynh, lisp sau đây, yêu cầu Bạn pick các node của polyline sẽ biến 2D polyline thành 3D polyline. Sau đó bạn tiếp tục thay đổi độ cao các node của 3d polyline

;;; Lisp thay doi do cao cac node cua POLYLINE
;;; copyright by Thiep 7/2009
;;; yeu cau: cai dat day du Expresstools
;;;--------------------------
(defun DXF (code en) (cdr (assoc code (entget en))))
;;;---------------------
(defun SAVE_MODE ()
(command "UCS" "W" "")
(setq OLD_OSMODE (getvar "OSMODE")
OLD_CECOLOR (getvar "CECOLOR")
OLD_AUTOSNAP (getvar "AUTOSNAP")
OLD_ORTHOMODE (getvar "ORTHOMODE")
)
(setvar "cmdecho" 0)
(setvar "plinegen" 1)

)
(defun RESTORE ()
(setvar "osmode" OLD_OSMODE)
(setvar "AUTOSNAP" OLD_AUTOSNAP)
(setvar "ORTHOMODE" OLD_ORTHOMODE)
(setvar "CECOLOR" OLD_CECOLOR)
(setvar "cmdecho" 1)
)
;;;--------------------------
;;;----------------------------------------
(defun 3DPoly (Lp *ModelSpace* / PntArr)
(setq PntArr (vlax-make-safearray
vlax-vbDouble
(cons 0 (1- (length Lp)))
)
)
(vlax-safearray-fill PntArr Lp)
(vla-Add3Dpoly *ModelSpace* PntArr)
)
;;;-----------------------------------
(vl-load-com)
(defun c:3dp (/ ActDoc *Model* wp lwp Obj n pn pcl Pe lstP Elev lt lstN)
(SAVE_MODE)
(setvar "osmode" 1)
(setq ActDoc (vla-get-ActiveDocument (vlax-get-acad-object))
*Model* (vla-get-ModelSpace ActDoc)
)
(while (setq pn (getpoint "\nPick a point on Polyine: "))
(setq lwp (ssname (ssget pn) 0))
(redraw lwp 3)
(setq heinode (getreal "\nEnter height of node: ")
obj (vlax-ename->vla-object lwp)
lstP (ACET-GEOM-VERTEX-LIST lwp)
)
(if (eq (dxf 0 lwp) "LWPOLYLINE")
(progn
(setq Elev (vla-get-Elevation obj))
(setq lstN nil)
(foreach lt lstP
(if (and (eq (car lt) (car pn)) (eq (cadr lt) (cadr pn)))
(setq lt (list (car lt) (cadr lt) heinode))
(setq lt (list (car lt) (cadr lt) Elev))
)
(setq lstN (append lt lstN))
)
(vla-update (3DPoly lstN *Model*))
(vla-delete obj)
)
(progn
(setq lstP (ACET-GEOM-VERTEX-LIST lwp))
(setq lstN nil)
(foreach lt lstP
(if (and (eq (car lt) (car pn)) (eq (cadr lt) (cadr pn)))
(setq lt (list (car lt) (cadr lt) heinode))
)
(setq lstN (append lt lstN))
)
(vla-update (3DPoly lstN *Model*))
(vla-delete obj)
)
)
)
(RESTORE)
(princ "\nChuc cac ban vui ve! Thiep")
(princ)
)

Tuy nhiên, nếu bạn thay đổi 1 polyline có hàng 100 node thì nên dùng cách khác nhanh hơn: Dùng bảng kê tọa độ trong Excel đổi qua đuôi *.csv, sau đó xây dựng 1 3D polyline theo 1 lisp khác.

Bác có cái lisp và excel .csv thực hiện vẽ 3d polyline không cho em xin với!
Cảm ơn trươc :cheers:
  • 0

#871 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 12 March 2010 - 06:41 PM

Anh em trên diễn đàn bớt chút thời gian xem xét và giải quyết vướng mắc về lisp "mtl" trên của em với, em đang cần quá.
Xin chân thành cảm ơn!!!

Bạn có thể sử dụng Lisp của bác Thiep hoặc sử dụng code này đã sửa lại cho bạn :
Chú ý sử dụng code của bác Thiep là phải cài phụ trợ Express

(defun c:mtl(/ doc Util MS c1 c2 kc2tl L1 oldos i j p dgiao pc2)
(vl-load-com)
(setq doc (vla-get-activeDocument (vlax-get-acad-object))
Util (vla-get-utility doc)
MS (vla-get-ModelSpace doc))
(vla-StartUndoMark doc)
(setq c1 (car(entsel "\n Chon duong bien thu nhat :")))
(setq c2 (car(entsel "\n Chon duong bien thu hai :")))
(if (not *kc2tl*) (setq *kc2tl* 2))
(setq kc2tl (getdist (strcat "\n Khoang cach giua taluy ngan va taluy dai < "
(rtos *kc2tl* 2 2) " > : "
)
)
)
(if (not kc2tl) (setq kc2tl *kc2tl*) (setq *kc2tl* kc2tl))
(setq L1 (vlax-curve-getDistAtParam c1
(setq pre (vlax-curve-getEndParam c1))
)
)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq i 0 j 0)
(Repeat (1+ (fix (/ L1 kc2tl)))
(setq p (vlax-curve-getPointAtDist c1 i))
(setq dgiao (vlax-curve-getClosestPointTo c2 p nil))
(if (= (rem j 2) 0)
(setq pc2 dgiao)
(setq pc2 (list (/ (+ (car p) (car dgiao)) 2) (/ (+ (cadr p) (cadr dgiao)) 2) 0))
)
(vla-addline MS (vlax-3d-point p)
(vlax-3d-point pc2)
)
(setq i (+ i kc2tl))
(setq j (1+ j))
);repeat
(setvar "osmode" oldos)
(vla-EndUndoMark doc)
(princ)
)

:cheers:

Vì có một số lượng lớn bản vẽ cần quản lý nên PP nhờ các Bác viết giúp 1 Lisp nhẳm làm cho công việc dể dàng hơn như sau.
......
Phụ thêm với Lisp ( sau khi đã tạo được 1 danh sách) là làm sao Rename Filenames của tất cả các b/v (vài ngàn b/v trong 1 folder) với tên nguyên gốc dạng 12345-001-X-XX.dwg trở thành 12345-001.dwg
.....

Chào Phiphi
Bạn sử dụng code này thử xem sao :

(defun c:rnf(/ f fn list_dwg tbve_find tbve_re nx)
(setq f (getfiled "\n Chon 1 file bat ki trong folder"
"" "dwg" 4))
(setq fn (vl-filename-directory f))
(setq list_dwg (vl-directory-files fn "*.dwg"))
(if (= (strlen fn) 3)
(setq tbve_find (substr f (+ (strlen fn) 1) (strlen f)))
(setq tbve_find (substr f (+ (strlen fn) 2) (strlen f)))
)
(setq tbve_re (getstring t (strcat "\n Ten Ban ve can thay < " tbve_find " > : ")))
(foreach x list_dwg
(if (wcmatch x tbve_re)
(progn
(setq nx (strcat (substr tbve_re 1 (1- (strlen tbve_re)))
(substr x (strlen tbve_re) 1)
(substr x (- (strlen x) 3) 4)
)
)
(vl-file-rename (strcat fn "\\" x)
(strcat fn "\\" nx)
)
)
)
(princ (strcat "\n Ban ve : " x " da duoc thay thanh ban ve : " nx))
);foreach
(textscr)
(princ)
)

Hướng dẫn sử dụng
1.Gõ lệnh Rnf (rename files) -> Chon 1 file .dwg trong folder mà bạn cần đặt tên. Cụ thể là chọn 1 file bất kì trong folder Test Attribute trên máy tính của bạn
2. Gõ tên file cần thay thế. Chú ý * là kí tự đại diện
123456-001-X-01.dwg -> phải được thay bằng 123456-00* (cái này giống với ý của Phi phi đã post là 12345-001-X-XX.dwg

Command: rnf

Ten Ban ve can thay < 123456-001-X-01.dwg > : 123456-00*

Ban ve : 123456-001-X-01.dwg da duoc thay thanh ban ve : 123456-001.dwg
Ban ve : 123456-002-A-03.dwg da duoc thay thanh ban ve : 123456-002.dwg
Ban ve : 123456-003-B-04.dwg da duoc thay thanh ban ve : 123456-003.dwg
Ban ve : 123456-004-C-02.dwg da duoc thay thanh ban ve : 123456-004.dwg
Ban ve : 123456-005-D-06.dwg da duoc thay thanh ban ve : 123456-005.dwg

-> Toàn bộ bản vẽ được thay rồi.
Thế là vui nhé.
:cheers:
  • 2

#872 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 12 March 2010 - 07:45 PM

Chào Tue_NV, trường hợp trong folder có vài bản vẽ missing (rất phổ biến) thì Rename theo cách trên có được chính xác hay không vậy Tue_NV?
PP có thử 5 bv trong folder đã post thì thấy OK.
Cám ơn nhiều nhé.
(Còn yêu cầu thứ nhất thì Tue_NV có ý kiến gì không?)
  • 0

#873 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 12 March 2010 - 09:20 PM

Chào Tue_NV, trường hợp trong folder có vài bản vẽ missing (rất phổ biến) thì Rename theo cách trên có được chính xác hay không vậy Tue_NV?
PP có thử 5 bv trong folder đã post thì thấy OK.
Cám ơn nhiều nhé.
(Còn yêu cầu thứ nhất thì Tue_NV có ý kiến gì không?)

Chào Phiphi
Cách trên hoàn toàn chính xác. Chỉ có điều để nhập được chính xác kí tự cần thay bản vẽ thì khi chọn tên bản vẽ trong hộp thoại thì Phiphi nên chọn tên bản vẽ đó nằm trong bản vẽ missing (rất phổ biến) đó. Phiphi hiểu chứ? :cheers:

Lisp sẽ tự động kiểm tra anh bản vẽ nào mà cùng chữ với bản vẽ thay thế thì nó mới thay
Ví dụ : Chuỗi "123456-001-X-01.dwg" = với chuỗi này "123456-00*" -> file này sẽ được thay
Chuỗi "123456-011-X-01.dwg" không bằng với chuỗi này "123456-00*" -> file này sẽ không được thay

+ Ngoài ra, Phiphi cũng cần chú ý rằng file khi thay không được trùng nhau. Computer không bao giờ không chấp nhập như vậy, bằng chứng là bạn copy và paste 1 file tại chổ của file đó thì nó bao giờ cũng thêm vào tiền tố trước file đó là Copyof....

Ví dụ : ở dòng này mà bạn đánh như sau :

Command: rnf

Ten Ban ve can thay < 123456-001-X-01.dwg > : 123456-0*
=> Nếu như vậy bản vẽ sẽ bị trùng tên ngay và lúc này Lisp sẽ thay 1 tên file trong số các file đó.
Do đó hãy cẩn thận. Be careful!!!!

Nếu bạn đánh chẳng trùng tên hay chuỗi không bằng nhau (sự so sánh chuỗi) thì Lisp sẽ hiện bảng thông báo
Đây là Lisp chỉnh lại để hiện lên thông báo đó

(defun c:rnf(/ f fn list_dwg tbve_find tbve_re nx)
(setq f (getfiled "\n Chon 1 file bat ki trong folder"
"" "dwg" 4))
(setq fn (vl-filename-directory f))
(setq list_dwg (vl-directory-files fn "*.dwg"))
(if (= (strlen fn) 3)
(setq tbve_find (substr f (+ (strlen fn) 1) (strlen f)))
(setq tbve_find (substr f (+ (strlen fn) 2) (strlen f)))
)
(setq tbve_re (getstring t (strcat "\n Ten Ban ve can thay < " tbve_find " > : ")) i 0)
(foreach x list_dwg
(if (wcmatch x tbve_re)
(progn
(setq nx (strcat (substr tbve_re 1 (1- (strlen tbve_re)))
(substr x (strlen tbve_re) 1)
(substr x (- (strlen x) 3) 4)
)
)
(vl-file-rename (strcat fn "\\" x)
(strcat fn "\\" nx)
)
(setq i (1+ i))
(princ (strcat "\n Ban ve : " x " da duoc thay thanh ban ve : " nx))
)
)
);foreach
(if (= i 0) (alert "\n Chang co ban ve nao duoc thay ca :")
(progn
(princ (strcat "\n Co tong cong : " (itoa i) " ban ve duoc thay"))
(textscr)
)
)
(princ)
)

Y/cầu 1 của Phiphi vì Tue_NV chưa rõ ý của PP lắm nên chưa có ý kiến gì.
  • 1

#874 nqt266

nqt266

    biết vẽ circle

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

Đã gửi 12 March 2010 - 10:01 PM

Xin chân thành cảm ơn bác thiep và bac TUE_NV đã nhanh chóng giúp đỡ em,vì công việc đang gấp quá mà. Chúc 2 bác tiếp tục có những lisp hay để giúp đỡ anh em phần nào nhẹ bớt được công việc thiết kế. Chúc anh em trên diễn đàn mạnh khoẻ và sôi nổi!!!
  • 0

#875 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 12 March 2010 - 10:17 PM

Xin chân thành cảm ơn bác thiep và bac TUE_NV đã nhanh chóng giúp đỡ em,vì công việc đang gấp quá mà. Chúc 2 bác tiếp tục có những lisp hay để giúp đỡ anh em phần nào nhẹ bớt được công việc thiết kế. Chúc anh em trên diễn đàn mạnh khoẻ và sôi nổi!!!

Chân thành cảm ơn bạn vì lời chúc.

Tuy nhiên, mình nghĩ bạn nên tick Thanks ngay dưới bài viết thay vì viết những bài như vầy.

Vì rằng, việc tìm kiếm rất khó khăn, nhất là trong topic này.

:cheers:
  • 1

#876 svba1608

svba1608

    Tưởng Thị Tú Khuyên

  • Moderator
  • PipPipPipPipPipPipPip
  • 601 Bài viết
Điểm đánh giá: 620 (tốt)

Đã gửi 13 March 2010 - 12:09 AM

Chào bạn SVBA1608,
Cái lisp này mình đã sửa lại theo ý bạn. Bạn thử dùng xem nhé. Nó có hai kiểu chọn là pick nhiều điểm và pick đối tượng. Tất nhiên khi pick nhiều điểm thì nó hơi nhiêu khê hơn pick hai điểm. Nó yêu cầu bạn phải trả lời có chọn điểm tiếp theo hay không. Nếu bạn không chọn tiếp nó sẽ tính tổng khoảng cách từ điểm đầu lần lượt qua các điểm chọn tới điểm cuối cùng mà bạn đã chọn.
Bạn có thể so sánh cái lisp này với các lisp trước đó để thấy được cái cách mình sửa. Qua đó bạn có thể học được cách sửa lisp theo ý mình.
Chúc bạn vui.

Cảm ơn bác Bình rất nhiều! Lisp sử dụng tốt, tuy có một trục trặc nho nhỏ là lisp nhắc tới 2 lần: "Hay chon diem dau". Nhờ có lisp, em đã hoàn thành xong việc tính chiều dài.
Nay lại phải nhờ Diễn đàn giúp em một tay trong việc thống kê cao độ.

Hình đã gửi

Bản vẽ của em có nhiều nút, công việc của em là phải thống kê cao độ tại các nút và lập bảng. Thống kê bằng tay cao độ của 136 nút cũng không phải là quá lâu, nhưng mất nhiều công sức vì phải zoom, pan và sửa text nhiều. Hơn nữa nếu có thay đổi về phương án thiết kế, việc đánh số các nút thay đổi thì việc thống kê cũng phải thay đổi theo. Nên em muốn nhờ các bác trên Diễn đàn viết giùm một lisp như thế này thôi:
+ Chọn điểm đặt bảng.
+ Nhập nút lần 1. Pick vào 1 tên nút trên bản vẽ. Ví dụ: 66
+ Nhập nút lần 2. Pick vào 1 tên nút trên bản vẽ (nếu không có thì enter). Ví dụ: 67.
+ Nhập cao độ. Pick vào cao độ. Ví dụ: 11.50
Enter để kết thúc.
Khi đó lisp sẽ sắp xếp các tên nút và cao độ được pick bằng tay vào bảng.
Sở dĩ có 2 lần nhập tên nút là vì: các nút nằm cạnh nhau có cùng cao độ. Ví dụ: 66 và 67 có cùng cao độ 11.50, 75 và 86 có cùng cao độ 12.00, ... (chỉ có nút 9 có cao độ 11.46)
Nhờ các bác giúp một tay! Xin chân thành cảm ơn!
  • 0
http://khuyen.space

#877 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 13 March 2010 - 01:50 PM

Bác có cái lisp và excel .csv thực hiện vẽ 3d polyline không cho em xin với!
Cảm ơn trươc :cheers:

Chào bạn ducboss
Lisp của bạn được xây dựng tương tự như trên Lisp này, chỉ có điều là thay đờng LWPOLYLINE bằng đường 3DPOLY mà thôi
Lisp đó ở đây. Bạn tham khảo nhé :
LISP : Đọc dữ liệu từ file Excel trên hệ thống không có cài đặt Microsoft Excel., Đọc dữ liệu từ file Excel


......
.....
em muốn nhờ các bác trên Diễn đàn viết giùm một lisp như thế này thôi:
+ Chọn điểm đặt bảng.
+ Nhập nút lần 1. Pick vào 1 tên nút trên bản vẽ. Ví dụ: 66
+ Nhập nút lần 2. Pick vào 1 tên nút trên bản vẽ (nếu không có thì enter). Ví dụ: 67.
+ Nhập cao độ. Pick vào cao độ. Ví dụ: 11.50
Enter để kết thúc.
Khi đó lisp sẽ sắp xếp các tên nút và cao độ được pick bằng tay vào bảng.
Sở dĩ có 2 lần nhập tên nút là vì: các nút nằm cạnh nhau có cùng cao độ. Ví dụ: 66 và 67 có cùng cao độ 11.50, 75 và 86 có cùng cao độ 12.00, ... (chỉ có nút 9 có cao độ 11.46)
Nhờ các bác giúp một tay! Xin chân thành cảm ơn!

Chào svba
Làm như cách của em hơi lâu -> vì pick chọn từng Text
Như thế này nhé :
-> Tạo bảng hay update bảng
->Pick 1 diem tren man hinh de chon tiep / Hoac an Phim bat ki de ket thuc :
Pick trái chuột 1 điểm trên màn hình để chọn đối tượng
-> Quét chọn hoặc pick chọn 2 nút, 1 cao độ hoặc 1 nút, 1 cao độ (Nhanh nhất là chỉ chọn 1 lần thôi)
-> Lisp Thống kê
-> Cứ thế....
Lệnh là gtd
http://www.cadviet.c...files/2/gtd.rar

PS : SVba don't stay up late :cheers: . Good luck
  • 1

#878 bachngoctung

bachngoctung

    biết lệnh copy

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

Đã gửi 13 March 2010 - 10:44 PM

-Mình muốn nhờ các bạn giúp cho cái llisp diền thông số đường cong của đường . Hiện nay mình đã có cái lisp dạng như này, nhưng nó ko hoàn hảo lắm > lisp mình có được thì khi sử dụng nó bắt nhập góc chuyển hướng A và bán kính đường cong R thì nó mới tính được. Giờ mình muốn cái lisp mà chỉ cần pick vào đường cong cần tính toán và nó điền ra thông số của đường cong đó luôn ko phải nhập giá trị A và R nữa.
-Mình up luôn cái lisp mà hiện nay mình đang có > nhờ các bạn cải tiến giùm > Chân thành cảm ơn :cheers:
http://www.cadviet.c...ng__lenh_ts.lsp
  • 0

#879 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 15 March 2010 - 10:30 AM

-Mình muốn nhờ các bạn giúp cho cái llisp diền thông số đường cong của đường . Hiện nay mình đã có cái lisp dạng như này, nhưng nó ko hoàn hảo lắm > lisp mình có được thì khi sử dụng nó bắt nhập góc chuyển hướng A và bán kính đường cong R thì nó mới tính được. Giờ mình muốn cái lisp mà chỉ cần pick vào đường cong cần tính toán và nó điền ra thông số của đường cong đó luôn ko phải nhập giá trị A và R nữa.
-Mình up luôn cái lisp mà hiện nay mình đang có > nhờ các bạn cải tiến giùm > Chân thành cảm ơn :cheers:
http://www.cadviet.c...ng__lenh_ts.lsp

Chào bạn Bachngoctung,
Trước hết bạn phải định nghĩa cái thông số đường cong của bạn là những thông số gì đã chứ. Thực tình khi đọc cái yêu cầu của bạn và cái líp kèm theo, mình thấy nó hơi khó hiểu.
Cái lisp của bạn yêu cầu nhập giá trị góc chuyển hướng là góc gì vậy, có phải là góc giữa hai tiếp tuyến của đường cong tại hai đầu mút của nó hay không??? và có vẻ như cái lisp này chỉ áp dụng cho các đường cong là cung tròn thì phải??? Vậy với các đường cong khác thì sao???
Trong CAD có một số hàm để xác địng các thông số của đường cong, nhưng không biết các thông số này có phù hợp với cái bạn cần hay không.???
Đó là các hàm (vlax-curve-get******) Bạn có thể tham khảo trong Help Developer của Cad, mục Autolisp Reference.

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.

#880 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 15 March 2010 - 10:36 AM

Chào bạn ducboss
Lisp của bạn được xây dựng tương tự như trên Lisp này, chỉ có điều là thay đờng LWPOLYLINE bằng đường 3DPOLY mà thôi
Lisp đó ở đây. Bạn tham khảo nhé :
LISP : Đọc dữ liệu từ file Excel trên hệ thống không có cài đặt Microsoft Excel., Đọc dữ liệu từ file Excel

Chào svba
Làm như cách của em hơi lâu -> vì pick chọn từng Text
Như thế này nhé :
-> Tạo bảng hay update bảng
->Pick 1 diem tren man hinh de chon tiep / Hoac an Phim bat ki de ket thuc :
Pick trái chuột 1 điểm trên màn hình để chọn đối tượng
-> Quét chọn hoặc pick chọn 2 nút, 1 cao độ hoặc 1 nút, 1 cao độ (Nhanh nhất là chỉ chọn 1 lần thôi)
-> Lisp Thống kê
-> Cứ thế....
Lệnh là gtd
http://www.cadviet.c...files/2/gtd.rar

PS : SVba don't stay up late :cheers: . Good luck

Hu hu hu,
Ối giời, bác Tue_NV ơi,
Nhìn V L X mà rơi lệ dài.
Mót hổng được biết hỏi ai
Thôi thì lại phải mót "khoai giun" rồi.
Hu hu hu........
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.