Chuyển đến nội dung
Diễn đàn CADViet
vinhxtkt

Xin Lisp Copy Tăng Giảm Theo Độ Dốc

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

Anh em ai giúp viết giúp cho mình lisp copy tăng hoặc giảm theo độ dốc với. Mình tìm trên diễn đàn chưa thấy lisp kiểu này. Mình cảm ơn nhiều

  • Vote tăng 1
  • Vote giảm 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Anh em ai giúp viết giúp cho mình lisp copy tăng hoặc giảm theo độ dốc với. Mình tìm trên diễn đàn chưa thấy lisp kiểu này. Mình cảm ơn nhiều

Sao ko thấy pro nào giúp vậy. Diễn đàn ai biết chia sẻ cho mình với. Thanks nhìu

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Quá ít thông tin để giúp bạn. Gì cũng lisp, mà k thèm mô tả nó làm cái j. Diễn đàn giờ nhiều bạn kiệm lời quá :)

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Quá ít thông tin để giúp bạn. Gì cũng lisp, mà k thèm mô tả nó làm cái j. Diễn đàn giờ nhiều bạn kiệm lời quá :)

Hề hề hề,

Không phải là kiệm lời mà là quá tự tin, cho rằng mọi người ai cũng gỏi như mình nên cứ nói ít hiểu nhiều vậy thôi. Ai không hiểu thì tự tìm mà hiểu, không cần giải thích nhiều.    Cơ khổ.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Quá ít thông tin để giúp bạn. Gì cũng lisp, mà k thèm mô tả nó làm cái j. Diễn đàn giờ nhiều bạn kiệm lời quá :)

 

Chắc là anh chủ thớt vừa đi ăn cỗ đám ma về vẫn còn đang líu tìu tìu, nên kiệm lời bác ạ!

Bỗng dưng em nhớ câu chuyện vui dân gian:

 

Có anh chàng vốn tính tham ăn, hễ ngồi vào bàn ăn là anh ta lại quan sát ...trận địa rồi rotate mâm cỗ một góc sao cho đĩa thức ăn ngon nhất lọt vào tầm gắp. Và thế là anh ta cứ gắp lia lịa , vì thế anh ta ít nói chuyện trong bữa ăn.

Một lần đi ăn cỗ đám ma nhà hàng xóm , ngồi vào mâm là anh bắt đầu trổ nghề....LÁI MÁY GẶT ĐẬP LIÊN HỢP.

Mấy ông khách cùng mâm ức chế quá mới tìm cách hỏi chuyện để hãm bới tốc độ... gặt đập , bèn hỏi:

- Nhà ông ở đâu???

- Đây! (anh ta đáp).

- Vợ ông làm nghề gì???

- Buôn! (anh ta đáp)

- Thế ông sinh được mấy cháu???

Anh ta bèn giơ một ngón tay trỏ của bàn tay trái chỉ thẳng lên trời ra hiệu có một con.

- Thế cha mẹ ông có khỏe không???

Anh ta bèn gật đầu....

 

P/s:  Dù sao em cũng xin được  cảm ơn anh chủ thớt, vì qua thớt này em tìm kiếm được một con lisp hữu ích cho bản thân em :Lisp C+ : Copy nhiều text, mỗi text nếu có chứa số ở cuối chuỗi sẽ được tăng lên 1 đơn vị khi copy

 

 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Anh em ai giúp viết giúp cho mình lisp copy tăng hoặc giảm theo độ dốc với. Mình tìm trên diễn đàn chưa thấy lisp kiểu này. Mình cảm ơn nhiều

Không phải tiết kiệm lời mà tưởng nói như vậy là hiểu rồi chứ. 

Trong diễn đàn có lisp copy tăng giảm với một hằng số cho trước. nhưng mình muốn một  lisp copy tăng giảm theo độ dốc cho trước.

Nó có dạng kiểu như thế này: Ta copy một số từ điểm A đến điểm B. Đầu tiên nó tự nhận text tại điểm A, sau đó ta nhập dộ dốc cần copy, sau đó copy đến điểm B,  lisp tự nhận khoảng cách từ A đến B và cộng hoặc trừ với khoảng chênh lệch do độ dốc từ A đến B.

VD như sau: Từ A đến B có độ dốc 2%. điểm A có cao độ 10m, khoảng cách từ A đến B là 10m (cái khoảng cách này là mình VD thôi, còn  lisp trong bài toán nó sẽ tự nhận khi copy từ A sang B). Như vậy khi copy từ A đến B sẽ cho giá trị tại điểm B là: 10.2m (B = 10+2%*10 = 10.2m) và cứ thế ta copy đến điểm C, D ... nó sẽ tự cho các kết quả

 Lisp này theo mình nghĩ giống  lisp copy tăng giảm trên diễn đàn nhưng khác là thông số nhập vào là % tăng giảm theo độ dốc và  lisp tự nhận khoảng cách trong quá trình ta copy.

AE ai rành về  lisp có thể giúp mình với. Mình cảm ơn nhiều!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Không phải tiết kiệm lời mà tưởng nói như vậy là hiểu rồi chứ. 

Trong diễn đàn có lisp copy tăng giảm với một hằng số cho trước. nhưng mình muốn một  lisp copy tăng giảm theo độ dốc cho trước.

Nó có dạng kiểu như thế này: Ta copy một số từ điểm A đến điểm B. Đầu tiên nó tự nhận text tại điểm A, sau đó ta nhập dộ dốc cần copy, sau đó copy đến điểm B,  lisp tự nhận khoảng cách từ A đến B và cộng hoặc trừ với khoảng chênh lệch do độ dốc từ A đến B.

VD như sau: Từ A đến B có độ dốc 2%. điểm A có cao độ 10m, khoảng cách từ A đến B là 10m (cái khoảng cách này là mình VD thôi, còn  lisp trong bài toán nó sẽ tự nhận khi copy từ A sang B). Như vậy khi copy từ A đến B sẽ cho giá trị tại điểm B là: 10.2m (B = 10+2%*10 = 10.2m) và cứ thế ta copy đến điểm C, D ... nó sẽ tự cho các kết quả

 Lisp này theo mình nghĩ giống  lisp copy tăng giảm trên diễn đàn nhưng khác là thông số nhập vào là % tăng giảm theo độ dốc và  lisp tự nhận khoảng cách trong quá trình ta copy.

AE ai rành về  lisp có thể giúp mình với. Mình cảm ơn nhiều!

Hề hề hề,

Gửi bạn cái này để bạn tham khảo. Không biết có đúng ý bạn không. Nếu đúng thì tốt và nếu không đúng càng tốt hơn bởi bạn sẽ hiểu rằng không phải mọi người đều giỏi như bạn.. Vì thế bạn cần có bản vẽ để mô tả chính xác điều bạn cần nhé.

http://www.cadviet.com/upfiles/5/5194_copycaodo.lsp

(defun c:cpd (/ oldos h els els1 txt dd dd1 h1 p0 p1 )
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq  h (atof (cdr (assoc 1 (setq els (entget (setq txt (car (entsel "\n Chon text cao do bat dau: "))))))))           
         dd 0.0  )
(if (or (= (cdr (assoc 0 els)) "MTEXT") (and (= (cdr (assoc 0 els)) "TEXT") (= (cdr (assoc 72 els)) 0) (= (cdr (assoc 73 els)) 0)))
     (setq p0 (cdr (assoc 10 els)))
     (setq p0 (cdr (assoc 11 els)))
)
(command "undo" "be")
(while (setq p1 (getpoint p0 "\n Nhap diem tiep theo"))
        (if (not (setq dd1 (getreal "\n Nhap do doc tiep theo: ")))
            (setq dd1 dd)   )
        (setq len (distance p0 p1)
                  h1 (+ h (* len dd1))  )
        (command "copy" txt "" p0 p1)
        (setq txt (entlast)
                  els1 (entget txt)
                  els1 (subst (cons 1 (rtos h1 2 2)) (assoc 1 els1) els1) )
        (entmod els1)
        (setq p0 p1 h h1 dd dd1)
)
(command "undo" "e")
(setvar "osmode" oldos)
(princ)
)
             

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

 sao mình không dùng được vậy ban phamthanhbinh ơi. mình gõ lệnh cpd nhưng máy ko hiểu lệnh.

nhưng dù sao mình cũng cảm ơn bạn phamthanhbinh và các bạn khác đã chia sẻ.

Thực ra trong bài viết mình cũng đã cố miêu tả và có cái VD cũng khá cụ thể rồi. Mình không rành về lsp nên không biết mô tả thêm như thế nào cho các bạn hiểu. Mình hay thiết kế phần san lấp mặt bằng (làm bằng thủ công) nên hay rải cao độ thiết kế tại các mắt lưới nên cần một lsp copy tăng giảm theo độ dốc để tiện khi rải cao độ mắt lưới thuận tiện hơn. Bạn nào có lsp nào như vậy cho mình xin với. mình cảm ơn nhiều.

Cảm ơn cadviet đã có trang web hay và bổ ích!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Lsp của bác Bình chạy tốt mà! Bạn copy rồi paste vào file lisp, đừng down nhiều khi do lỗi của diễn đàn.

Cách viết khác. Hy vọng phù hợp yêu cầu của bạn...

(defun c:cpd (/ data dis ent new npt poi slo txt val)
(or def_slope (setq def_slope 0))
(setq slo (getreal (strcat "\nNhap do doc <" (rtos def_slope 2 2) "%>: ")))
(if (not slo)
(setq slo def_slope)
(setq def_slope slo))
(princ "\nChon cao do goc TEXT or MTEXT!")
(if (setq txt (ssget "_+.:E:S" '((0 . "*TEXT"))))
(progn (setq ent (entget (ssname txt 0))
val (distof (cdr (assoc 1 ent)))
poi (cdr (assoc 10 ent)))
(or val
(and (princ "\nKhong lay duoc gia tri cao do tu Text!")
(setq val (getreal "\nNhap gia tri cao do goc <0>: ")))
(setq val 0))
(while (setq npt (getpoint "\nDiem dat cao do moi: " poi))
(progn (setq dis (distance poi npt)
new (rtos (+ val (* dis slo 0.01)) 2 2)
data (vl-remove-if '(lambda (x) (member (car x) '(-1 1 5 10 330 410))) ent))
(entmakex (append data (list (cons 1 new) (cons 10 npt))))))))
(princ))

P/s: Mỗi lần gọi lệnh một độ dốc, thay đổi độ dốc thì gọi lại lệnh.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

 mình gõ lệnh cpd nhưng máy ko hiểu lệnh.

nhưng dù sao mình cũng cảm ơn bạn phamthanhbinh và các bạn khác đã chia sẻ.

 

Lỗi do anh chưa biết sử dụng lisp trên diễn đàn:

 

Command: CPd Unknown command "CPD".  Press F1 for help.

Command: AP APPLOAD cpd.lsp successfully loaded.

Command:

Command:

Command: CPd

 Chon text cao do bat dau: ....

Command:

 Nhap diem tiep theo....

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Lsp của bác Bình chạy tốt mà! Bạn copy rồi paste vào file lisp, đừng down nhiều khi do lỗi của diễn đàn.

Cách viết khác. Hy vọng phù hợp yêu cầu của bạn...

(defun c:cpd (/ data dis ent new npt poi slo txt val)

(or def_slope (setq def_slope 0))

(setq slo (getreal (strcat "\nNhap do doc <" (rtos def_slope 2 2) "%>: ")))

(if (not slo)

(setq slo def_slope)

(setq def_slope slo))

(princ "\nChon cao do goc TEXT or MTEXT!")

(if (setq txt (ssget "_+.:E:S" '((0 . "*TEXT"))))

(progn (setq ent (entget (ssname txt 0))

val (distof (cdr (assoc 1 ent)))

poi (cdr (assoc 10 ent)))

(or val

(and (princ "\nKhong lay duoc gia tri cao do tu Text!")

(setq val (getreal "\nNhap gia tri cao do goc <0>: ")))

(setq val 0))

(while (setq npt (getpoint "\nDiem dat cao do moi: " poi))

(progn (setq dis (distance poi npt)

new (rtos (+ val (* dis slo 0.01)) 2 2)

data (vl-remove-if '(lambda (x) (member (car x) '(-1 1 5 10 330 410))) ent))

(entmakex (append data (list (cons 1 new) (cons 10 npt))))))))

(princ))

P/s: Mỗi lần gọi lệnh một độ dốc, thay đổi độ dốc thì gọi lại lệnh.

cái này của bạn Bình và bạn Mạnh là trúng rồi đó, nó chính là như vậy. Nhưng có một cái bất tiện là khi ta chọn vào text đầu tiên, nó chọn luôn điểm gốc của text làm điểm 1. Hai bạn chỉnh giúp lại một xíu là khi chọn text xong rồi ta chọn tiếp điểm gốc, sau đó mới copy đến điểm số 2. Mình sơ họa bằng cad bạn nào biết giúp mình với, cảm ơn nhiềuhttp://www.cadviet.com/upfiles/5/148940_vd.dwg

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

cái này của bạn Bình và bạn Mạnh là trúng rồi đó, nó chính là như vậy. Nhưng có một cái bất tiện là khi ta chọn vào text đầu tiên, nó chọn luôn điểm gốc của text làm điểm 1. Hai bạn chỉnh giúp lại một xíu là khi chọn text xong rồi ta chọn tiếp điểm gốc, sau đó mới copy đến điểm số 2. Mình sơ họa bằng cad bạn nào biết giúp mình với, cảm ơn nhiềuhttp://www.cadviet.com/upfiles/5/148940_vd.dwg

Hề hề hề,

Nếu trúng rồi thì bạn chỉ cần bỏ toàn bộ đoạn code sau:

(if (or (= (cdr (assoc 0 els)) "MTEXT") (and (= (cdr (assoc 0 els)) "TEXT") (= (cdr (assoc 72 els)) 0) (= (cdr (assoc 73 els)) 0)))

(setq p0 (cdr (assoc 10 els)))

(setq p0 (cdr (assoc 11 els)))

)

và thay thế bằng:

(setq p0 (getpoint "\n Chon diem bat dau")) 

Sau đó lưu lại file lisp với tên bạn thích. Load nó vào Cad rồi chạy thử nhé.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

 

Hề hề hề,

Gửi bạn cái này để bạn tham khảo. Không biết có đúng ý bạn không. Nếu đúng thì tốt và nếu không đúng càng tốt hơn bởi bạn sẽ hiểu rằng không phải mọi người đều giỏi như bạn.. Vì thế bạn cần có bản vẽ để mô tả chính xác điều bạn cần nhé.


cái này của bạn Bình và bạn Mạnh là trúng rồi đó, nó chính là như vậy. Nhưng có một cái bất tiện là khi ta chọn vào text đầu tiên, nó chọn luôn điểm gốc của text làm điểm 1. Hai bạn chỉnh giúp lại một xíu là khi chọn text xong rồi ta chọn tiếp điểm gốc, sau đó mới copy đến điểm số 2. Mình sơ họa bằng cad bạn nào biết giúp mình với, cảm ơn nhiềuhttp://www.cadviet.com/upfiles/5/148940_vd.dwg

* B​ắt đầu có dấu hiệu bớt giỏi rồi đó!

* Sửa lại lisp cho bạn và bổ sung chức năng rải 1 lần nhiều cao độ, với cùng độ dốc và khoảng cách lưới đều nhằm giảm bớt thao tác

* Cần chú ý rằng: Nếu bạn bớt giỏi đi một xíu thì lisp cũng bớt ngu đi một xíu ... :D

(defun c:csa  (/ make_elev dis ent new npt poi slo txt val orp n)
 (defun make_elev  ()
  (setq dis (distance orp npt)
        new (rtos (+ val (* dis slo 0.01 n)) 2 2))
  (entmakex (append (vl-remove-if '(lambda (x) (member (car x) '(-1 1 5 10 330 410))) ent)
                    (list (cons 1 new) (cons 10 (polar poi (angle orp npt) (* dis n)))))))
 (or def_slope (setq def_slope 0))
 (setq slo (getreal (strcat "\nNhap do doc <" (rtos def_slope 2 2) "%>: ")))
 (if (not slo)
  (setq slo def_slope)
  (setq def_slope slo))
 (princ "\nChon cao do goc TEXT or MTEXT!")
 (if (and (setq txt (ssget "_+.:E:S" '((0 . "*TEXT")))) (setq orp (getpoint "\nChon diem goc: ")))
  (progn (setq ent (entget (ssname txt 0))
               val (distof (cdr (assoc 1 ent)))
               poi (cdr (assoc 10 ent)))
         (or val
             (and (princ "\nKhong lay duoc gia tri cao do tu Text!")
                  (setq val (getreal "\nNhap gia tri cao do goc <0>: ")))
             (setq val 0))
         (if (setq npt (getpoint "\nDiem tiep theo: " orp))
          (progn (initget 6)
                 (or (setq n (getint "\nSo doi tuong can tao [1 or Enter de chon tung diem]: ")) (setq n 1))
                 (if (> n 1)
                  (repeat n (make_elev) (setq n (1- n)))
                  (progn (make_elev) (while (setq npt (getpoint "\nDiem tiep theo: " orp)) (make_elev))))))))
 (princ))
  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Hiiii, Bây giờ là ngon rồi, đặc biệt là cái lsp của bác quocmanh. Trước đây mình toàn nhân chia cộng trừ = thủ công, giờ đỡ hơn nhiều rồi. Cảm ơn các bạn đã giúp đỡ. Hôm nào có gì cần giúp lại nếu mình biết sẽ nhiệt tình chia sẻ (nhưng ko biết viết lsp đâu nhé  :D )

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Thanks bạn Mạnh, lisp của bạn rất hay, nhưng thường thì hạ tầng hay ghi là 2.50 (m) ít ghi 2500 (mm), nhờ bạn sửa thêm được không, cảm ơn bạn

 

image.png

  • Like 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×