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

#1961 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 10 May 2009 - 09:11 AM

Trước tiên em vô cùng cảm ơn anh hoành đã mở topic này. Nhờ nó mà em và mọi người đã có nhiều lisp hay giúp công việc được thực hiện nhanh hơn. Em có vấn đề cần như sau :
Trong đây có lisp copy thông minh tuy nhiên em muốn hỏi làm sao để thay thế bước nhảy của việc copy vì đôi khi em không muốn 1->2->3 VD em muốn bước 1->1.2->1.4... thì phải thay đổi như thế nào anh có thể giúp em sửa đổi để có thể chọn bước nhảy trước khi copy không? Em xin cảm ơn!!

Bạn sử dụng đoạn Code mà Tue_NV mới viết nhé. Hy vọng bạn hài lòng :
(Defun c:copytang()
(setq oldim (getvar "dimzin"))
(setvar "dimzin" 0)
(setq ss (car(entsel "\n Ban chon Text so :")))
(setq tp (getint "\n so chu so thap phan :"))
(if (not soo) (setq soo 0.25))
(setq socopy (getreal (strcat "\n Nhap so can copy :<" (rtos soo 2 tp) "> :")))
(if (not socopy) (setq socopy soo) (setq soo socopy))
(setq po (getpoint "\n Diem dau copy :"))
(setq po2 (getpoint po "\n Diem cuoi copy :"))
(command "copy" ss "" po po2)
(setq ss (entlast))
(setq po po2)
(while po
(setq ent (entget ss))
(setq solay (distof (cdr(assoc 1 ent)) 2))
(setq soup (rtos (+ solay socopy) 2 tp))
(setq ent (subst (cons 1 soup) (assoc 1 ent) ent))
(entmod ent)
(setq po2 (getpoint po "\n Diem cuoi copy/ Enter ket thuc lenh:"))
(command "copy" ss "" po po2)
(setq po po2)
(setq ss (entlast))
)

(setvar "dimzin" oldim)
(princ)
)
:mellow:
  • 2

#1962 nguyenkhoadung98

nguyenkhoadung98

    biết vẽ pline

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

Đã gửi 11 May 2009 - 11:22 AM

chào cả nhà Cadviet, hôm nay lại xin mạn phép nhờ vả các bạn : chả là thế này dạo này mình phải vẽ tim của các con sông trên cad, các con sông này rất là ngoằn ngèo và chiều rộng lòng sông mỗi chỗ một khác (việc ofset là vô dụng), việc tìm tim của nó là rất thủ công và mệt mỏi, mình hi vọng các bạn cho mình 1 lisp (hoặc cách nào đó) có thể tự động tìm tim của sông. biết rằng sông đã được nối thành 1 Pline duy nhất
mình gửi file mẫu đi kèm : (đã chuyển về Cad 2004)

http://www.mediafire...lj0znm5kz/1.dwg

cảm ơn các bạn :mellow:
  • 0

#1963 minhtu2004

minhtu2004

    biết lệnh chamfer

  • Members
  • PipPipPipPip
  • 219 Bài viết
Điểm đánh giá: 34 (tàm tạm)

Đã gửi 11 May 2009 - 11:44 AM

- Xin chào đầu tuần.
- Mình mới viềt 1 đọan líp để hỗ trợ công việc, nhưng không được theo ý. Nhờ chỉnh lại dùm.
BT : dialog {
label = "Hop Thoai Chu thich";
: popup_list{
list = "\n Atama"
"\n Negarami";
key = "leader";
label = "Chon cau chu thich:";
edit_width = 30;
}
ok_cancel;
}

(defun c:BT()
(setq dcl_id (load_dialog "BT.dcl"))
(if (not (new_dialog "BT" dcl_id)) (exit))
(action_tile "leader" "(setq Choncauchuthich $value)")
(cond
((= Choncauchuthich "0")(set_tile "text" " Atama"))
((= Choncauchuthich "1")(action_tile "leader" "(set_tile \"text\" \" Negarami\")"))
)
(start_dialog)
(unload_dialog dcl_id)
(action_tile "cancel" "(exit_dialog)")
(action_tile "accept" "(done_dialog)")
(setq PT1 (getpoint "\n Chon diem thu nhat:")
PT2 (getpoint PT1"\n Chon diem thu hai:")
)
(cond
((= Choncauchuthich "0")(setq LE " Atama"))
((= Choncauchuthich "1")(setq LE " Negarami"))
)
(command
"dimstyle" "R" "TYUKI" ""
"leader" PT1 PT2 "A" LE "")
(princ)
)
Vấn đề ở đây là nó chỉ có lấy 1 chữ nào mà mình thực hiện trước thôi.
VD:-Lúc đầu mình chọn chữ Atama thì mấy lần thực hiện lệnh sau vẫn lấy chữ Atama mặc dù đã chọn chữ Negarami. Nhờ mọi người sửa dùm. Cám ơn
  • 0

-Nhận thực hiện bản vẽ 3D bằng revit.
-Liên hệ: 01664793290.


#1964 HoangSon614

HoangSon614

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 254 Bài viết
Điểm đánh giá: 66 (tàm tạm)

Đã gửi 11 May 2009 - 11:56 AM

-Bạn gỏ MODEMACRO enter xong gỏ nội dung muốn hiển thị vào là ok.
-Dùng lisp: bạn lưu dòng này vào file lisp cho nó loa tự động.
(setvar "MODEMACRO" "nội dung")


Bạn Duy cho mình hỏi tý!
1. Khi gỏ lệnh MODEMACRO xong OK thì hiển thị, nhưng khi thoát vả khởi động lại thì không còn
2. Mình muốn khi khởi động thì hiện ngày, tháng, năm, mình đã chép đoạn lisp vào support/acad doc.lsp nhưng vẫn không được.
Code: (Setvar "modemacro" "[$(edtime,$(getvar,date,time),DDD-DD/MO/YYYY-H:MM AM/PM)]")
Hãy giúp mình với. Cảm ơn bạn nhiều!
  • 0
-~-~-~-~-~-~-~-~-~-~-~-~-~-~
Hôm qua là sự học hỏi nhận được sau 1 ngày
Ngày mai là sự bí ẩn mà chúng ta sẽ khám phá


------------------------------------------
http://www.tailieukythuat.com

#1965 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 May 2009 - 02:23 PM

Bạn Duy cho mình hỏi tý!
1. Khi gỏ lệnh MODEMACRO xong OK thì hiển thị, nhưng khi thoát vả khởi động lại thì không còn
2. Mình muốn khi khởi động thì hiện ngày, tháng, năm, mình đã chép đoạn lisp vào support/acad doc.lsp nhưng vẫn không được.
Code: (Setvar "modemacro" "[$(edtime,$(getvar,date,time),DDD-DD/MO/YYYY-H:MM AM/PM)]")
Hãy giúp mình với. Cảm ơn bạn nhiều!

Bạn mở Notepad lên -> Paste đoạn Code này vào. Lưu vào trong support của CAD với tên ví dụ là ngay.lsp
Vào CAD : gõ
Command : (load "ngay.lsp")
Vậy là OK

chào cả nhà Cadviet, hôm nay lại xin mạn phép nhờ vả các bạn : chả là thế này dạo này mình phải vẽ tim của các con sông trên cad, các con sông này rất là ngoằn ngèo và chiều rộng lòng sông mỗi chỗ một khác (việc ofset là vô dụng), việc tìm tim của nó là rất thủ công và mệt mỏi, mình hi vọng các bạn cho mình 1 lisp (hoặc cách nào đó) có thể tự động tìm tim của sông. biết rằng sông đã được nối thành 1 Pline duy nhất
mình gửi file mẫu đi kèm : (đã chuyển về Cad 2004)

http://www.mediafire...lj0znm5kz/1.dwg

cảm ơn các bạn :mellow:

Bạn cho mình hỏi cái đường tim mình có vòng lại bằng màu đỏ trong file thì vẽ như thế nào vậy bạn ?
http://www.cadviet.c...pfiles/1_12.dwg
  • 1

#1966 nguyenkhoadung98

nguyenkhoadung98

    biết vẽ pline

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

Đã gửi 11 May 2009 - 04:09 PM

Bạn cho mình hỏi cái đường tim mình có vòng lại bằng màu đỏ trong file thì vẽ như thế nào vậy bạn ?
http://www.cadviet.c...pfiles/1_12.dwg


thanks bạn nhiều

những đoạn mẩu như vậy bỏ qua cậu ạ, coi như nó vẫn nối thẳng thành 1 đường những cái mẫu tương tự bỏ qua hết cậu ạ (nếu mà vẽ cả tim cho cái ấy cũng đc cậu ah) cái nào dễ hơn cho cậu thì cậu làm :mellow:

còn đoạn ngã 3 thì tim tương ứng cũng là ngã 3 như trong file này cậu a :mellow:

http://www.mediafire...lemdmy/1_12.dwg
  • 0

#1967 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 May 2009 - 05:00 PM

thanks bạn nhiều

những đoạn mẩu như vậy bỏ qua cậu ạ, coi như nó vẫn nối thẳng thành 1 đường những cái mẫu tương tự bỏ qua hết cậu ạ (nếu mà vẽ cả tim cho cái ấy cũng đc cậu ah) cái nào dễ hơn cho cậu thì cậu làm mellow.gif

còn đoạn ngã 3 thì tim tương ứng cũng là ngã 3 như trong file này cậu a cheers.gif

http://www.mediafire...lemdmy/1_12.dwg


Tue_NV viết xong đoạn Code này. Thực hiện đoạn Code cho file kèm theo ( 2 hình vẽ bên tay phải)
http://www.cadviet.c...pfiles/1_13.dwg

(defun c:timsong()
(command "undo" "be")
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)

(setq pl1 (car(entsel "\n Chon duong Polyline tu nhat :")))
(setq pl2 (car(entsel "\n Chon duong Polyline tu hai :")) i 1)
(setq pr1 (vlax-curve-getEndParam pl1))
(setq diem1 (vlax-curve-getPointAtParam pl1 0))
(setq diem2 (vlax-curve-getClosestPointTo pl2 diem1))
(setq dtbinh (list (/ (+ (car diem1) (car diem2)) 2) (/ (+ (cadr diem1) (cadr diem2)) 2) 0))

(while (<= i pr1)
(setq diem1 (vlax-curve-getPointAtParam pl1 i))
(setq diem2 (vlax-curve-getClosestPointTo pl2 diem1))
(setq dtbinh1 (list (/ (+ (car diem1) (car diem2)) 2) (/ (+ (cadr diem1) (cadr diem2)) 2) 0))
(setq frome (entlast));; chon doi tuong cuoi cung
(command "Pline" dtbinh dtbinh1 "")
(command "Pedit" "m" frome "L" "" "j" "10" "")

(setq dtbinh dtbinh1)
(setq i (1+ i))
)


(Command "undo" "end")
(setvar "osmode" oldos)
(princ)
)

Có những đoạn ngoằn nghèo có lúc không được, bạn phải chỉnh tay lại thôi. 
Chào bạn


  • 2

#1968 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 May 2009 - 05:23 PM

chào cả nhà Cadviet, hôm nay lại xin mạn phép nhờ vả các bạn : chả là thế này dạo này mình phải vẽ tim của các con sông trên cad, các con sông này rất là ngoằn ngèo và chiều rộng lòng sông mỗi chỗ một khác (việc ofset là vô dụng), việc tìm tim của nó là rất thủ công và mệt mỏi, mình hi vọng các bạn cho mình 1 lisp (hoặc cách nào đó) có thể tự động tìm tim của sông. biết rằng sông đã được nối thành 1 Pline duy nhất
mình gửi file mẫu đi kèm : (đã chuyển về Cad 2004)

http://www.mediafire...lj0znm5kz/1.dwg

cảm ơn các bạn :mellow:

Chào bạn nguyenkhoadung98,
Mình đã xem file của bạn và thấy có một số ý kiến như sau:
1/- Để vẽ tim sông bạn không nên nối tất cả hai bờ sông thành một pline như vậy. Điều này sẽ khó khăn hơn cho việc xác định các điểm trên đường tim.
2/- Nều mỗi bờ sông là một pline riêng biệt, bạn có thể lấy đường tim theo cách như sau được không?
- chọn một bờ sông, chia bờ sông đó thành các điểm chia với khoảng cách chia đủ nhỏ. Cái này đã có lisp của bác Hoành rồi thì phải.
- tạo một vòng lặp qua mỗi điểm chia, dựng đường pháp tuyến tại điểm chia với pline cắt pline bờ sông thứ hai tại một điểm. Xác định trung điểm của đoạn thẳng nối điểm chia với điểm cắt vừa tìm được. ta có một điểm trên đường tim.
- Nối các điểm trên đường tim bằng pline.
3/- Với các sông có nhiều nhánh thì nên cắt các pline thành các đoạn tương ứng với các nhánh và làm như trên với mỗi nhánh để có đường tim từng nhánh. cuối cùng nối lại thành đường tim chung.

Thực ra mình cũng hiểu là như vậy chưa hẳn đã đúng là đường tim do pháp tuyến của pline thứ nhất chưa chắc là pháp tuyến của pline thứ hai tại điểm cắt. Nhưng có lẽ giải pháp này cũng có thể chấp nhận với sai số cho phép phải không bạn.

Do hiện tại mình khá bận nên chưa thể ngồi viết lisp cho bạn được, bạn hãy thử làm rồi post lên mọi người sẽ góp ý hoàn thiện giúp bạn bạn nhé.
Chúc 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.

#1969 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 May 2009 - 05:41 PM

Thứ nhất là Tue_NV không thích gọi bằng cậu, và lời nói của bạn khi nói thì không hay cho lắm. Bạn nhờ người khác mà lại nói như thế à? :mellow:
Dù sao thì Tue_NV cũng viết xong đoạn Code này. Thực hiện đoạn Code cho file kèm theo ( 2 hình vẽ bên tay phải)
http://www.cadviet.c...pfiles/1_13.dwg

(defun c:timsong()
(command "undo" "be")
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)

(setq pl1 (car(entsel "\n Chon duong Polyline tu nhat :")))
(setq pl2 (car(entsel "\n Chon duong Polyline tu hai :")) i 1)
(setq pr1 (vlax-curve-getEndParam pl1))
(setq diem1 (vlax-curve-getPointAtParam pl1 0))
(setq diem2 (vlax-curve-getClosestPointTo pl2 diem1))
(setq dtbinh (list (/ (+ (car diem1) (car diem2)) 2) (/ (+ (cadr diem1) (cadr diem2)) 2) 0))

(while (<= i pr1)
(setq diem1 (vlax-curve-getPointAtParam pl1 i))
(setq diem2 (vlax-curve-getClosestPointTo pl2 diem1))
(setq dtbinh1 (list (/ (+ (car diem1) (car diem2)) 2) (/ (+ (cadr diem1) (cadr diem2)) 2) 0))
(setq frome (entlast));; chon doi tuong cuoi cung
(command "Pline" dtbinh dtbinh1 "")
(command "Pedit" "m" frome "L" "" "j" "10" "")

(setq dtbinh dtbinh1)
(setq i (1+ i))
)


(Command "undo" "end")
(setvar "osmode" oldos)
(princ)
)
Có những đoạn ngoằn nghèo có lúc không được, bạn phải chỉnh tay lại thôi. Vì có những lúc con người hiểu thế mà máy không hiểu thế. Bạn hiểu ý tôi chứ?
Chào bạn

Bác Tue_NV ơi,
Bản vẽ của bạn nguyenkhoadung98 chỉ có một pline duy nhất cho cả hai bên bờ sông mà bác. Vậy thì cái chọn pline thứ nhất và chọn pline thứ hai của bác ra sao ạ.
Theo lisp bác viết thì bác mặc định khoảng cách giữa các điểm chia là 1. Nên chăng bác cho người dùng tùy ý nhập khoảng cách này sẽ thuận lợi hơn vì có thể các bản vẽ có các tỷ lệ khác nhau, nếu cứ giữ một giá tri như vậy thì ở bản vẽ có tỉ lệ nhỏ sẽ dễ mất chính xác bác ạ.
Bác sử dụng hàm (vlax-curve-getClosestPointTo pl2 diem1) rất hay, mình cứ lăn tăn về cách chọn cái điểm này bác ạ. Mình định dùng điểm cắt của pháp tuyến với pline thứ nhất tại điểm chia với pline thứ hai thì có sai nhiều lắm không hả bác ? Bác cho mình biết ý kiến với nha.
Thank bác nhiều nhiều.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#1970 HoangSon614

HoangSon614

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 254 Bài viết
Điểm đánh giá: 66 (tàm tạm)

Đã gửi 11 May 2009 - 06:51 PM

Bạn mở Notepad lên -> Paste đoạn Code này vào. Lưu vào trong support của CAD với tên ví dụ là ngay.lsp
Vào CAD : gõ
Command : (load "ngay.lsp")
Vậy là OK

Bạn cho mình hỏi cái đường tim mình có vòng lại bằng màu đỏ trong file thì vẽ như thế nào vậy bạn ?
http://www.cadviet.c...pfiles/1_12.dwg

Cảm ơn bạn Tue_NV, nhưng mình muốn khi khởi động Cad thì lisp tự load lên luôn, không cần gõ lệnh. Nhờ bạn giúp mình.
  • 0
-~-~-~-~-~-~-~-~-~-~-~-~-~-~
Hôm qua là sự học hỏi nhận được sau 1 ngày
Ngày mai là sự bí ẩn mà chúng ta sẽ khám phá


------------------------------------------
http://www.tailieukythuat.com

#1971 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 May 2009 - 08:37 PM

Cảm ơn bạn Tue_NV, nhưng mình muốn khi khởi động Cad thì lisp tự load lên luôn, không cần gõ lệnh. Nhờ bạn giúp mình.

Code đây bạn :
(defun S::STARTUP ()
(Setvar "modemacro" "[$(edtime,$(getvar,date,time),DDD-DD/MO/YYYY-H:MM AM/PM)]")
(princ)
)
Bạn chép đoạn code này và lưu dưới 1 file Lisp .lsp. Cách để load file Lisp tự động chắc bạn đã biết :
Bạn gõ lệnh AP/ rồi bấm vào hình chiếc cặp, sau đó nút add và chọn tới lisp mà bạn muốn add.
Tiếp đó chọn file .lsp -> Load -> close
http://www.cadviet.c.../untitled_6.bmp
Như vậy , Tue_NV đã giúp bạn : khi khởi động Cad thì lisp tự load lên luôn, không cần gõ lệnh rồi nhé.
Chúc thành công.
  • 1

#1972 HoangSon614

HoangSon614

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 254 Bài viết
Điểm đánh giá: 66 (tàm tạm)

Đã gửi 11 May 2009 - 09:14 PM

Code đây bạn :

(defun S::STARTUP ()
(Setvar "modemacro" "[$(edtime,$(getvar,date,time),DDD-DD/MO/YYYY-H:MM AM/PM)]")
(princ)
)
Bạn chép đoạn code này và lưu dưới 1 file Lisp .lsp. Cách để load file Lisp tự động chắc bạn đã biết :
Bạn gõ lệnh AP/ rồi bấm vào hình chiếc cặp, sau đó nút add và chọn tới lisp mà bạn muốn add.
Tiếp đó chọn file .lsp -> Load -> close
http://www.cadviet.c.../untitled_6.bmp
Như vậy , Tue_NV đã giúp bạn : khi khởi động Cad thì lisp tự load lên luôn, không cần gõ lệnh rồi nhé.
Chúc thành công.

Cảm ơn Tue_NV. Mình đã làm được rồi. Có gì nhờ bạn giúp đỡ nha. Cảm ơn bạn 1lần nữa.
  • 0
-~-~-~-~-~-~-~-~-~-~-~-~-~-~
Hôm qua là sự học hỏi nhận được sau 1 ngày
Ngày mai là sự bí ẩn mà chúng ta sẽ khám phá


------------------------------------------
http://www.tailieukythuat.com

#1973 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 May 2009 - 09:33 PM

thanks bạn nhiều

những đoạn mẩu như vậy bỏ qua cậu ạ, coi như nó vẫn nối thẳng thành 1 đường những cái mẫu tương tự bỏ qua hết cậu ạ (nếu mà vẽ cả tim cho cái ấy cũng đc cậu ah) cái nào dễ hơn cho cậu thì cậu làm :mellow:

còn đoạn ngã 3 thì tim tương ứng cũng là ngã 3 như trong file này cậu a :mellow:

http://www.mediafire...lemdmy/1_12.dwg


Thứ nhất là Tue_NV không thích gọi bằng cậu, và lời nói của bạn khi nói thì không hay cho lắm. Bạn nhờ người khác mà lại nói như thế à? :cheers: :cheers:


2/- Nều mỗi bờ sông là một pline riêng biệt, bạn có thể lấy đường tim theo cách như sau được không?
- tạo một vòng lặp qua mỗi điểm chia, dựng đường pháp tuyến tại điểm chia với pline cắt pline bờ sông thứ hai tại một điểm. Xác định trung điểm của đoạn thẳng nối điểm chia với điểm cắt vừa tìm được. ta có một điểm trên đường tim.
- Nối các điểm trên đường tim bằng pline.
3/- Với các sông có nhiều nhánh thì nên cắt các pline thành các đoạn tương ứng với các nhánh và làm như trên với mỗi nhánh để có đường tim từng nhánh. cuối cùng nối lại thành đường tim chung.

Thực ra mình cũng hiểu là như vậy chưa hẳn đã đúng là đường tim do pháp tuyến của pline thứ nhất chưa chắc là pháp tuyến của pline thứ hai tại điểm cắt. Nhưng có lẽ giải pháp này cũng có thể chấp nhận với sai số cho phép phải không bạn.

Chúc thành công.

Cái ý thứ 2 có thể không dựng được.
qua mỗi điểm chia, dựng đường pháp tuyến tại điểm chia với pline cắt pline bờ sông thứ hai tại một điểm : Không thể, có thể có một điểm, hoặc có thể có 2 điểm. Vậy bác định lấy điểm nào? Và cái ý dòng màu đỏ là ý đúng đấy.
Cái ý thứ 3 thì Tue_NV hoàn toàn đồng ý với Bác PhamThanhBinh nên cắt các pline thành các đoạn tương ứng với các nhánh và làm như trên với mỗi nhánh để có đường tim từng nhánh. cuối cùng nối lại thành đường tim chung.
Trong hình vẽ của Tue_NV đã chia cắt thành 2 Pline dọc theo bờ sông và Tue_NV đã cắt thành 3 nhánh sông (mỗi nhánh gồm 2 Pline dọc theo bờ sông) 3 nhánh đó giao nhau tại ngã 3 của con sông
File Tue_NV đã cắt đây :
http://www.cadviet.c...pfiles/1_13.dwg

Theo lisp bác viết thì bác mặc định khoảng cách giữa các điểm chia là 1. Nên chăng bác cho người dùng tùy ý nhập khoảng cách này sẽ thuận lợi hơn vì có thể các bản vẽ có các tỷ lệ khác nhau, nếu cứ giữ một giá tri như vậy thì ở bản vẽ có tỉ lệ nhỏ sẽ dễ mất chính xác bác ạ.

Cái này có lẽ không cần thiết. Vì dù có vẽ ở tỉ lệ nhỏ hay tỉ lệ lớn thì cái đường vẽ nối các trung điểm được dựng từ Pline1 và Pline 2. Pline1 và Pline 2 sdựng được => Đường vẽ nối các trung điểm sẽ dựng được cho dù vẽ ở tỉ lệ nhỏ hay tỉ lệ lớn. Bạn hiểu ý mình ở đây không?
Nhưng để đảm bảo chính xác hơn thì Tue_NV sẽ lấy số điểm chia là 2 trên 1 phân đoạn (segment).
File Lisp này đã được Tue_NV chỉnh sửa lại chút ít. Chạy cùng với file này http://www.cadviet.c...pfiles/1_13.dwg

(defun c:timsong()
(command "undo" "be")
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)

(setq pl1 (car(entsel "\n Chon duong Polyline tu nhat :")))
(setq pl2 (car(entsel "\n Chon duong Polyline tu hai :")) i 0.5)
(setq pr1 (vlax-curve-getEndParam pl1))
(setq diem1 (vlax-curve-getPointAtParam pl1 0))
(setq diem2 (vlax-curve-getClosestPointTo pl2 diem1))
(setq dtbinh (list (/ (+ (car diem1) (car diem2)) 2) (/ (+ (cadr diem1) (cadr diem2)) 2) 0))
(setq dtbinh1 (list (/ (+ (car diem1) (car diem2)) 2) (/ (+ (cadr diem1) (cadr diem2)) 2) 0))
(command "Pline" dtbinh dtbinh1 "")
(command "zoom" "e")
(while (<= i pr1)
(setq diem1 (vlax-curve-getPointAtParam pl1 i))
(setq diem2 (vlax-curve-getClosestPointTo pl2 diem1))
(setq dtbinh dtbinh1)
(setq dtbinh1 (list (/ (+ (car diem1) (car diem2)) 2) (/ (+ (cadr diem1) (cadr diem2)) 2) 0))
(setq frome (entlast));; chon doi tuong cuoi cung
(command "Pline" dtbinh dtbinh1 "")
(command "Pedit" "m" frome "L" "" "j" "10" "")

(setq dtbinh dtbinh1)
(setq i (+ i 0.5))
)
(command "zoom" "p")
(Command "undo" "end")
(setvar "osmode" oldos)
(princ)
)

  • 0

#1974 thuyvan0210

thuyvan0210

    biết zoom

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

Đã gửi 11 May 2009 - 11:02 PM

mình muốn nhờ các bạn viết giúp mình một đoạn lisp nội dung là:
mình có 1pline, cần so sánh các điểm nút của pline đó với một móc so sánh và ghi các cao độ
mình xin diễn giải đoạn lisp thực hiện như sau:
- chọn mốc so sánh
- nhập giá trị mốc so sánh
- chọn vị trí ghi text cao độ
- chọn pline (có các nút lấy cao độ so sánh)
mình cũng đã thử làm nhưng ko làm được. Mong các bạn giúp đỡ! Xin cảm ơn
  • 0

#1975 nguyenkhoadung98

nguyenkhoadung98

    biết vẽ pline

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

Đã gửi 12 May 2009 - 08:18 AM

Thứ nhất là Tue_NV không thích gọi bằng cậu, và lời nói của bạn khi nói thì không hay cho lắm. Bạn nhờ người khác mà lại nói như thế à? :mellow:
Dù sao thì Tue_NV cũng viết xong đoạn Code này. Thực hiện đoạn Code cho file kèm theo ( 2 hình vẽ bên tay phải)
http://www.cadviet.c...pfiles/1_13.dwg

(defun c:timsong()
(command "undo" "be")
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)

(setq pl1 (car(entsel "\n Chon duong Polyline tu nhat :")))
(setq pl2 (car(entsel "\n Chon duong Polyline tu hai :")) i 1)
(setq pr1 (vlax-curve-getEndParam pl1))
(setq diem1 (vlax-curve-getPointAtParam pl1 0))
(setq diem2 (vlax-curve-getClosestPointTo pl2 diem1))
(setq dtbinh (list (/ (+ (car diem1) (car diem2)) 2) (/ (+ (cadr diem1) (cadr diem2)) 2) 0))

(while (<= i pr1)
(setq diem1 (vlax-curve-getPointAtParam pl1 i))
(setq diem2 (vlax-curve-getClosestPointTo pl2 diem1))
(setq dtbinh1 (list (/ (+ (car diem1) (car diem2)) 2) (/ (+ (cadr diem1) (cadr diem2)) 2) 0))
(setq frome (entlast));; chon doi tuong cuoi cung
(command "Pline" dtbinh dtbinh1 "")
(command "Pedit" "m" frome "L" "" "j" "10" "")

(setq dtbinh dtbinh1)
(setq i (1+ i))
)


(Command "undo" "end")
(setvar "osmode" oldos)
(princ)
)
Có những đoạn ngoằn nghèo có lúc không được, bạn phải chỉnh tay lại thôi. Vì có những lúc con người hiểu thế mà máy không hiểu thế. Bạn hiểu ý tôi chứ?
Chào bạn


thành thật xin lỗi bạn TUE_NV, mình kô có ý j đâu, ý mình muốn nói cái đó kô quan trong lắm nên bạn cứ làm thế nào tiện cho bạn nhất ý mà ( lần sau phải tuyệt đối tránh từ "dễ" kô các bạn hiểu nhầm ) thật là ngại wa, thành thật xin lỗi và cảm ơn bạn nhiều. Sorry Sorry :mellow:
  • 0

#1976 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 May 2009 - 08:46 AM

thành thật xin lỗi bạn TUE_NV, mình kô có ý j đâu, ý mình muốn nói cái đó kô quan trong lắm nên bạn cứ làm thế nào tiện cho bạn nhất ý mà ( lần sau phải tuyệt đối tránh từ "dễ" kô các bạn hiểu nhầm ) thật là ngại wa, thành thật xin lỗi và cảm ơn bạn nhiều. Sorry Sorry :mellow:

Tue_NV cũng hơi nóng. Bạn sử dụng đoạn Code kèm theo file bản vẽ mà Tue_NV đã post lại ở bài viết số 1974 "Topic "Viết Lisp theo yêu cầu" và cho mình biết ý kiến sau khi sử dụng thử nhé.

mình muốn nhờ các bạn viết giúp mình một đoạn lisp nội dung là:
mình có 1pline, cần so sánh các điểm nút của pline đó với một móc so sánh và ghi các cao độ
mình xin diễn giải đoạn lisp thực hiện như sau:
- chọn mốc so sánh
- nhập giá trị mốc so sánh
- chọn vị trí ghi text cao độ
- chọn pline (có các nút lấy cao độ so sánh)
mình cũng đã thử làm nhưng ko làm được. Mong các bạn giúp đỡ! Xin cảm ơn

Chào bạn thuyvan0210.
Bạn có thể upload file bản vẽ .dwg và nói rõ hơn ý của bạn được không?
  • 1

#1977 nguyenkhoadung98

nguyenkhoadung98

    biết vẽ pline

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

Đã gửi 12 May 2009 - 09:35 AM

Tue_NV cũng hơi nóng. Bạn sử dụng đoạn Code kèm theo file bản vẽ mà Tue_NV đã post lại ở bài viết số 1974 "Topic "Viết Lisp theo yêu cầu" và cho mình biết ý kiến sau khi sử dụng thử nhé.



mình đã dùng thử rồi, lisp dùng rất tốt bạn ah, tuy có 1 số điểm tự sửa nhưng mà cũng kô mất thời gian lắm đâu. cảm ơn bạn lần nữa :mellow:
  • 0

#1978 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 May 2009 - 10:34 AM

mình đã dùng thử rồi, lisp dùng rất tốt bạn ah, tuy có 1 số điểm tự sửa nhưng mà cũng kô mất thời gian lắm đâu. cảm ơn bạn lần nữa :mellow:

Hai vòng tròn màu đỏ mà Tue_NV khoanh tròn mà hỏi bạn, chính là điiểm yếu mà Lisp không thể làm tốt công việc của mình được. Bởi vì có những lúc con người hiểu thế nhưng Lisp không hiểu thế. Ở những đoạn mở rộng sông thường bị lỗi, hay những khúc cua ngoặc hay bị lỗi. bạn thấy rồi đấy. Vì Lisp phải duyệt qua từng điểm chia trên Pline.
Ở những đoạn cua quá ngoặc bạn nên Break Pline tạo thêm 1 dòng sông gồm 2 Pline rồi thực hiện lệnh Lisp.
Mong bạn hiểu ý.
Chúc thành công
  • 1

#1979 nguyenkhoadung98

nguyenkhoadung98

    biết vẽ pline

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

Đã gửi 12 May 2009 - 10:42 AM

Hai vòng tròn màu đỏ mà Tue_NV khoanh tròn mà hỏi bạn, chính là điiểm yếu mà Lisp không thể làm tốt công việc của mình được. Bởi vì có những lúc con người hiểu thế nhưng Lisp không hiểu thế. Ở những đoạn mở rộng sông thường bị lỗi, hay những khúc cua ngoặc hay bị lỗi. bạn thấy rồi đấy. Vì Lisp phải duyệt qua từng điểm chia trên Pline.
Ở những đoạn cua quá ngoặc bạn nên Break Pline tạo thêm 1 dòng sông gồm 2 Pline rồi thực hiện lệnh Lisp.
Mong bạn hiểu ý.
Chúc thành công


mình đã hiểu ý bạn TUE_NV, đúng là nên đổi những đoạn là arc thành PL như thế thì sẽ kô có lỗi ( cũng may mà của mình kô có nhiều đoạn arc lắm ), nhờ lisp ấy mà sáng nay mình đã làm xong công việc của của mấy ngày truớc :mellow: thanks bạn TUE thêm 1 lần :mellow:
  • 0

#1980 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 May 2009 - 11:05 AM

mình đã hiểu ý bạn TUE_NV, đúng là nên đổi những đoạn là arc thành PL như thế thì sẽ kô có lỗi ( cũng may mà của mình kô có nhiều đoạn arc lắm ), nhờ lisp ấy mà sáng nay mình đã làm xong công việc của của mấy ngày truớc :mellow: thanks bạn TUE thêm 1 lần :mellow:

Bạn có thể dùng lệnh Pe để chuyển arc thành Pline . Và thêm điểm chia trên Pline (cung arc vừa chuyển) (để Lisp chạy đúng hơn)bằng lệnh Pe hoặc bằng Lisp ở đây :Theem Node vao duong Pline (Đọc Kĩ nhé)
  • 0