Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Nguyen Hoanh

Viết Lisp theo yêu cầu

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

Phiphi-    175
Chào bác Phiphi,

Trong lisp mình viết, sử dụng việc chọn chuẩn là chọn hai điểm có tọa độ là các text mà bác muốn. Như vậy việc nội suy sẽ đơn giản hơn.

 

Nếu chọn text như bác đề nghị, mình thấy sẽ phức tạp hơn vì nó phụ thuộc vào người thiết lập bản vẽ trước đó rất nhiều. Text mà bác chọn là một đối tượng hoàn toàn độc lập với cái điểm bác định chọn. Người thiết kế có thể tùy tiện đặt cái text đó vào bất cứ đâu trên bản vẽ mà không cần có ràng buộc gì với điểm bác định chọn làm cơ sở nội suy. Ngay cả khi bác có đặt mối ràng buộc nào đó để giúp bác dễ nội suy thì người lập trình cũng không có cơ sở để tìm ra mối ràng buộc đó vì họ không hiểu cách ràng buộc của bác. Cũng có thể do mình còn non nớt về lisp nên chưa biết chăng????

Do vậy để có thể làm được theo ý bác, bác có thể cung cấp cho mình biết cái mối liên quan giữa cái text của bác với cái điểm chuẩn để nội suy thì mình có thể làm được. Trong trường hợp này, tốt nhất bác cho mình biết mối tương quan giữa điểm chèn text và điểm chọn bác ạ.

Ví dụ như trong cái lisp mình đã gửi bác thì mối tương quan đó được thể hiện ở tọa độ điểm chèn text là '( (car p4) (+ 5 (cadr p4))) với p4 là điểm chọn.

 

Theo bản vẽ bác đã post thì mình thấy việc chọn điểm chuẩn sẽ tốt hơn là việc chọn text biểu diễn điểm chuẩn bác ạ. Vì trên bản vẽ bác đã sử dụng pdmode = 3 nên việc xác định điểm sẽ rất chính xác chứ không tù mù như khi dùng pdmode = 0 bác ạ. Bác chỉ cần chọn điểm tương ứng với cái text bác muốn là lisp chạy vi vu ngay bác ạ.

 

Rất mong bác hiểu và thông cảm cho khả năng có hạn của mình. Chúc bác vui.

Lisp Bác viết dùng để thiết kế từ bước đầu, còn Lisp của bác Tdvn dùng để nhập thêm data được nội suy từ các số do người thiết kế đã thực hiện trước.

Cả hai Lisp đểu sử dụng tốt cả. Xin cảm ơn hai Bác nhé. PP.

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
tdvn    53
Wow, đúng là cái PP muốn.

Bác có thể sửa thêm để cho phép User chọn được nhiều điểm nội suy sau khi chỉ cần pick 2 số đầu tiên mà thôi.

Phần text thì copy đúng như 2 số đã cho hoặc cho phép User input tuỳ theo sở thích.

Cám ơn Bác rất nhiều

Câu "Phần text thì copy đúng như 2 số đã cho hoặc cho phép User input tuỳ theo sở thích" mình chưa hiểu lắm. Phần bổ sung như sau:

(defun C:NOISUY( / n1 n2 p p1 p2 pt h h1 h2 ht st1 st2)

(defun dxf( name n)

(cdr (assoc n (entget name)))

)

(defun gocam( goc)

(if (< goc 0.0) (+ 360.0 goc) goc)

)

(defun pvi( p1 p2)

(/ (* 180 (angle p1 p2)) pi)

)

(defun ra( g)

(/ (* g pi) 180)

)

(defun diemvuonggoc( p1 p2 p / p0)

(setq p0 (polar p (ra (+ 90.0 (gocam (pvi p1 p2)))) 10.0))

(inters p1 p2 p p0 nil)

)

(while (and (setq n1 (entsel "\nChon text 1")) (setq n2 (entsel "\nChon text 2")))

(setq n1 (car n1) n2 (car n2))

(while (setq p (getpoint "\nChon diem noi suy"))

(setq p1 (dxf n1 10) p2 (dxf n2 10) st1 (dxf n1 1) st2 (dxf n2 1))

(setq h1 (atof st1) h2 (atof st2))

(if (> h1 h2) (setq pt p2 p2 p1 p1 pt ht h2 h2 h1 h1 ht))

(setq p (diemvuonggoc p1 p2 p))

(if (and (> (distance p p2) (distance p p1)) (> (distance p p2) (distance p2 p1)))

(setq h (- h1 (/ (* (- h2 h1) (distance p p1)) (distance p1 p2))))

(setq h (+ h1 (/ (* (- h2 h1) (distance p p1)) (distance p1 p2))))

)

(command "_.text" p 0.5 0.0 (rtos h 2 3))

)

)

)

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
phamthanhbinh    3.123
Câu "Phần text thì copy đúng như 2 số đã cho hoặc cho phép User input tuỳ theo sở thích" mình chưa hiểu lắm. Phần bổ sung như sau:

(defun C:NOISUY( / n1 n2 p p1 p2 pt h h1 h2 ht st1 st2)

(defun dxf( name n)

(cdr (assoc n (entget name)))

)

(defun gocam( goc)

(if (

)

(defun pvi( p1 p2)

(/ (* 180 (angle p1 p2)) pi)

)

(defun ra( g)

(/ (* g pi) 180)

)

(defun diemvuonggoc( p1 p2 p / p0)

(setq p0 (polar p (ra (+ 90.0 (gocam (pvi p1 p2)))) 10.0))

(inters p1 p2 p p0 nil)

)

(while (and (setq n1 (entsel "\nChon text 1")) (setq n2 (entsel "\nChon text 2")))

(setq n1 (car n1) n2 (car n2))

(while (setq p (getpoint "\nChon diem noi suy"))

(setq p1 (dxf n1 10) p2 (dxf n2 10) st1 (dxf n1 1) st2 (dxf n2 1))

(setq h1 (atof st1) h2 (atof st2))

(if (> h1 h2) (setq pt p2 p2 p1 p1 pt ht h2 h2 h1 h1 ht))

(setq p (diemvuonggoc p1 p2 p))

(if (and (> (distance p p2) (distance p p1)) (> (distance p p2) (distance p2 p1)))

(setq h (- h1 (/ (* (- h2 h1) (distance p p1)) (distance p1 p2))))

(setq h (+ h1 (/ (* (- h2 h1) (distance p p1)) (distance p1 p2))))

)

(command "_.text" p 0.5 0.0 (rtos h 2 3))

)

)

)

Chào bác tdvn,

Lisp bác viết giúp mình được khá nhiều về việc đơn giản hóa cái logic của người lập trình. Cái bác Phiphi cần theo mình hiểu là bác cho bác ấy thêm một biến làm giá trị của độ chính xác hiển thị chuỗi của hàm rtos ấy mà. Biến này yêu cầu người dùng nhập vào khi chạy lisp bác ạ.

Ví dụ:

Bác thêm dòng code này:

(setq a (getint "\n Nhap do chinh xac hien thi: ")) vào trước dòng (command "_.text" .........) hoặc trước cả dòng code (While ........) tùy theo ý của bác.

Đổi dòng code viết text trên thành ( Command "_.text" p 0.5 0.0 (rtos h 2 a))

 

Mình đoán vậy, không biết có đúng ý của bác Phiphi không, mong bác đừng giận.

Chúc bác vui.

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
cuongtk2    40
Bác thử cái này xem đúng ý bác không

(defun C:NOISUY( / n1 n2 p p1 p2 pt h h1 h2 ht st1 st2)

(defun dxf( name n)

(cdr (assoc n (entget name)))

)

(defun gocam( goc)

(if (< goc 0.0) (+ 360.0 goc) goc)

)

(defun pvi( p1 p2)

(/ (* 180 (angle p1 p2)) pi)

)

(defun ra( g)

(/ (* g pi) 180)

)

(defun diemvuonggoc( p1 p2 p / p0)

(setq p0 (polar p (ra (+ 90.0 (gocam (pvi p1 p2)))) 10.0))

(inters p1 p2 p p0 nil)

)

(while (and (setq n1 (entsel "Chon text 1")) (setq n2 (entsel "Chon text 2")) (setq p (getpoint "\nChon diem noi suy")))

(setq n1 (car n1) n2 (car n2))

(setq p1 (dxf n1 10) p2 (dxf n2 10) st1 (dxf n1 1) st2 (dxf n2 1))

(setq h1 (atof st1) h2 (atof st2))

(if (> h1 h2) (setq pt p2 p2 p1 p1 pt ht h2 h2 h1 h1 ht))

(setq p (diemvuonggoc p1 p2 p))

(if (and (> (distance p p2) (distance p p1)) (> (distance p p2) (distance p2 p1)))

(setq h (- h1 (/ (* (- h2 h1) (distance p p1)) (distance p1 p2))))

(setq h (+ h1 (/ (* (- h2 h1) (distance p p1)) (distance p1 p2))))

)

(command "_.text" p 0.5 0.0 (rtos h 2 3))

)

)

 

Theo mình nghĩ bạn nên để n1 và n2 ra ngoài vòng lặp while, chỉ để lại p để chỉ phải chọn text 1 lần sau đó pick điểm p liên tiếp tuỳ ý.

Mọi thứ còn lại của bạn là ổn rồi

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
tdvn    53
Theo mình nghĩ bạn nên để n1 và n2 ra ngoài vòng lặp while, chỉ để lại p để chỉ phải chọn text 1 lần sau đó pick điểm p liên tiếp tuỳ ý.

Mọi thứ còn lại của bạn là ổn rồi

Chào bạn. ý của bác mình đã cập nhật vào bản mới rồi đó (bản ngày hôm nay).

 

Chào bác tdvn,

Lisp bác viết giúp mình được khá nhiều về việc đơn giản hóa cái logic của người lập trình. Cái bác Phiphi cần theo mình hiểu là bác cho bác ấy thêm một biến làm giá trị của độ chính xác hiển thị chuỗi của hàm rtos ấy mà. Biến này yêu cầu người dùng nhập vào khi chạy lisp bác ạ.

Ví dụ:

Bác thêm dòng code này:

(setq a (getint "\n Nhap do chinh xac hien thi: ")) vào trước dòng (command "_.text" .........) hoặc trước cả dòng code (While ........) tùy theo ý của bác.

Đổi dòng code viết text trên thành ( Command "_.text" p 0.5 0.0 (rtos h 2 a))

 

Mình đoán vậy, không biết có đúng ý của bác Phiphi không, mong bác đừng giận.

Chúc bác vui.

Mình nghỉ những vấn đề như độ cao textt, font hay đcx ... tức là những cái khá đơn giản quen thuộc để bác PP tự cập nhật theo ý thích của bác ấy. Mình cũng là dân viết lisp đã lâu nhưng trên diễn đàn này nhiều cái mình cũng bí nên tham gia viết cho vui, để vận dụng đầu óc và học hỏi.

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
Phiphi-    175
Câu "Phần text thì copy đúng như 2 số đã cho hoặc cho phép User input tuỳ theo sở thích" mình chưa hiểu lắm.

...

Vì nếu dùng Lisp áp dụng trong b/v thí dụ trên thì text nội suy ra không giống như 2 số (màu vàng) vừa pick.

noisuy.jpg

w1087.png

Vì vậy User phải sửa lại đoạn code: (command "_.text" p 0.5 0.0 (rtos h 2 3)) thì mới có text giống như text trong thí dụ, nhưng nếu bác cho phép User input kích thước, angle của text thì chắc sẽ tiện lợi hơn.

Thank you.

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
sucuph    1

Nhờ mọi người viết dùm cái lisp đo hệ số mái dốc, khi cần chỉ cần pick vào đối tượng là cho biết hệ số mái.Mong mọi người giúp đỡ.Thanks!

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
phamthanhbinh    3.123
Vì nếu dùng Lisp áp dụng trong b/v thí dụ trên thì text nội suy ra không giống như 2 số (màu vàng) vừa pick.

noisuy.jpg

w1087.png

Vì vậy User phải sửa lại đoạn code: (command "_.text" p 0.5 0.0 (rtos h 2 3)) thì mới có text giống như text trong thí dụ, nhưng nếu bác cho phép User input kích thước, angle của text thì chắc sẽ tiện lợi hơn.

Thank you.

Chào bác Phiphi,

Để làm điều bác muốn cũng đơn giản thôi. Bác hãy đặt biến cho các tham số mà bác muốn user tự nhập. Sau đó thay tên biến đó vào vị trí tương ứng trong dòng lệnh (command "-.text" .......) là được mà. Bác có thể tham khảo cách thay đổi độ chính xác thể hiện của giá trị tọa độ điểm nội suy mà mình đã trình bày trong bài post trả lời bác tdnv.

Chúc bác thành công.

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
phamthanhbinh    3.123
Nhờ mọi người viết dùm cái lisp đo hệ số mái dốc, khi cần chỉ cần pick vào đối tượng là cho biết hệ số mái.Mong mọi người giúp đỡ.Thanks!

Bác sucuph ơi,

Hệ số mái dốc là gì bác nhỉ ? Là góc nghiêng hay tang của góc nghiêng đó, hay tỉ số giữa chênh lệch độ cao và khoảng cách giữa hình chiếu của hai điểm......

Đối tượng mà bác muốn lấy độ dốc là line, pline, hay spline ......

Bác có thể cho biết cụ thể hơn một chút về yêu cầu của bác không ạ.

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
cuongtk2    40
Vì nếu dùng Lisp áp dụng trong b/v thí dụ trên thì text nội suy ra không giống như 2 số (màu vàng) vừa pick.

noisuy.jpg

w1087.png

Vì vậy User phải sửa lại đoạn code: (command "_.text" p 0.5 0.0 (rtos h 2 3)) thì mới có text giống như text trong thí dụ, nhưng nếu bác cho phép User input kích thước, angle của text thì chắc sẽ tiện lợi hơn.

Thank you.

Thực ra bạn không cần phải nhập vào góc nghiêng và chiều cao chữ. Lấy luôn code dxf của text mình chọn lúc đầu cho tiện.

Thay vì dùng hàm (command "text" .....)

thì bạn dùng

(setq n1 (subst (cons 10 p) (assoc 10 n1) n1)

n1 (subst (cons 40 (rtos h 2 3)) (assoc 40 n1) n1))

(entmake n1)

 

Như vậy text mới được tạo ra giống text mẹ lúc đầu , chỉ khác vị trí code-10 và nội dung code-40

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
Phiphi-    175
PP đang tìm 1 Lisp dùng để nội suy từ 2 số tượng trưng cho 2 cao độ, khi dùng chuột pick 1 điểm hay nhiều điểm nào đó dù bên trong hay/và 2 bên ngoài của 2 chử số trên (chỉ pick tương đối thẳng hàng với 2 số đã cho). Lisp sẽ dủng phương pháp tam giác đồng dạng để nội suy ra rồi vẽ thêm Points và đặt giá trị mới bên cạnh point.

Nhờ các Bác post lại hoặc viết giúp cho PP lisp mới. Xin cảm ơn.

Xin lưu ý, các chử số này chính là cao độ Z nằm bất kỳ vị trí nào trên bản vẽ, vị trí các số hoặc các Points chính là toạ độ X, Y.

Đây là hình và bản vẽ minh hoạ:

http://www.cadviet.com/upfiles/Add_points_new_numbers_1.zip

addpointsnewnumbersmp2.jpg

w596.png

Phần nội suy rồi đặt kết quả ngay tại những điểm User chọn của LISP các Bác viết thì làm việc OK rồi, nhưng còn phần "vẽ thêm Points" thì chưa có.

Đây là đoạn code vẽ thêm Points bên cạnh các số, nhờ các Bác viết chung vào LISP trên nhé. Vì khi có các Points, chúng ta có thể dùng cho các việc khác nữa. Thanks you.

Tham khảo thêm ở topic này: http://www.cadviet.com/forum/index.php?showtopic=9019

(defun c:ins_point (/ ss i ent point curLayer)
 (if (setq ss (ssget (list (cons 0 "TEXT"))))
   (progn
     (setq i 0
    curLayer (getvar "clayer"))
     (if (not (tblsearch "layer" "points"))
(command "-layer" "n" "points"  "c" "1" "points" "") ) ; tao layer Point
     (setvar "clayer" "points")	    		     ; Set layer Current
     (repeat (sslength ss)
(setq ent (ssname ss i)
      point (cdr (assoc 10 (entget ent)))
      txt (atof(cdr (assoc 1 (entget ent))))
      p (list (car point)(cadr point) txt)
      i	 (1+ i)
)
(entmake (list (cons 0 "POINT") (cons 10 p)))
     )
     (setvar "clayer" curLayer)
   )
 )
 (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
sucuph    1
Bác sucuph ơi,

Hệ số mái dốc là gì bác nhỉ ? Là góc nghiêng hay tang của góc nghiêng đó, hay tỉ số giữa chênh lệch độ cao và khoảng cách giữa hình chiếu của hai điểm......

Đối tượng mà bác muốn lấy độ dốc là line, pline, hay spline ......

Bác có thể cho biết cụ thể hơn một chút về yêu cầu của bác không ạ.

untitled_1.gif

trình bày cụ thể bằng hình, mong anh em giúp đỡ nha. Anh em quan tâm click xem hình đầy đủ mới thấy rõ, ảnh chất lượng kém quá.

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
cuongtk2    40
untitled_1.gif

trình bày cụ thể bằng hình, mong anh em giúp đỡ nha. Anh em quan tâm click xem hình đầy đủ mới thấy rõ, ảnh chất lượng kém quá.

Hình như bạn nhầm H/L thành L/H, bình thường nói mái dốc 60% hoặc 15% tức là tan(anpha)=0.60 = H/L

Đoạn code này có thể giúp bạn, trong Lisp ko có hàm tan, thường dùng sin/cos=tan, nếu cần cotan thì chỉnh lại nhé.

(defun c:gocdoc ( / ent p1 cao_text sp ep ang dodoc thap_phan)

(vl-load-com)

(setq ent (entsel "\nChon mai doc:"))

(setq cao_text 0.5

thap_phan 2

p1 (cadr ent)

ent (car ent)

sp (vlax-curve-getStartPoint ent)

ep (vlax-curve-getEndPoint ent)

ang (angle sp ep)

dodoc (* (abs (/ (sin ang) (cos ang))) 100)

dodoc (strcat (rtos dodoc 2 thap_phan) "%"))

(command "_.text" p1 cao_text 0 dodoc)

)

  • 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
phamthanhbinh    3.123
Phần nội suy rồi đặt kết quả ngay tại những điểm User chọn của LISP các Bác viết thì làm việc OK rồi, nhưng còn phần "vẽ thêm Points" thì chưa có.

Trời ạ, bác Phiphi đã test cái lisp của mình chưa vậy,

Trong lisp đó đã có vẽ point rồi mà. Đọc lisp của bác tdnv đúng là chưa có vẽ point, nhưng tưởng bác không quan tâm đến nó nên mình không góp ý. Bác xem lại cái lisp của mình xem nhé.

Chúc bác vui.

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
tdvn    53
Trời ạ, bác Phiphi đã test cái lisp của mình chưa vậy,

Trong lisp đó đã có vẽ point rồi mà. Đọc lisp của bác tdnv đúng là chưa có vẽ point, nhưng tưởng bác không quan tâm đến nó nên mình không góp ý. Bác xem lại cái lisp của mình xem nhé.

Chúc bác vui.

Lấy font, độ cao hay góc nghiêng text và vẽ point

(defun C:NOISUY( / n1 n2 p p1 p2 pt h h1 h2 ht)

(defun dxf( name n)

(cdr (assoc n (entget name)))

)

(defun gocam( goc)

(if (< goc 0.0) (+ 360.0 goc) goc)

)

(defun pvi( p1 p2)

(/ (* 180 (angle p1 p2)) pi)

)

(defun ra( g)

(/ (* g pi) 180)

)

(defun deg( so)

(/ (* 180 so) pi)

)

(defun diemvuonggoc( p1 p2 p / p0)

(setq p0 (polar p (ra (+ 90.0 (gocam (pvi p1 p2)))) 10.0))

(inters p1 p2 p p0 nil)

)

(while (and (setq n1 (entsel "text 1")) (setq n2 (entsel "text 2")))

(setq n1 (car n1) n2 (car n2))

(while (setq p (getpoint "\nDiem"))

(setq p1 (dxf n1 10) p2 (dxf n2 10) st1 (dxf n1 1) st2 (dxf n2 1))

(setq h1 (atof st1) h2 (atof st2))

(if (> h1 h2) (setq pt p2 p2 p1 p1 pt ht h2 h2 h1 h1 ht))

(setq p (diemvuonggoc p1 p2 p))

(if (and (> (distance p p2) (distance p p1)) (> (distance p p2) (distance p2 p1)))

(setq h (- h1 (/ (* (- h2 h1) (distance p p1)) (distance p1 p2))))

(setq h (+ h1 (/ (* (- h2 h1) (distance p p1)) (distance p1 p2))))

)

(command "_.text" "s" (dxf n1 7) p (dxf n1 40) (deg (dxf n1 50)) (rtos h 2 3))

(entmake (list (cons 0 "POINT") (cons 8 "points") (cons 10 p)))

)

)

)

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
Phiphi-    175
Lấy font, độ cao hay góc nghiêng text và vẽ point

...

Perfect ! Cám ơn bác TDVN.

Have a good day. PP.

 

@phamthanhbinh: Đúng là LISP Bác viết có vẽ được Points. Thank you.

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
phamthanhbinh    3.123
Perfect ! Cám ơn bác TDVN.

Have a good day. PP.

 

@phamthanhbinh: Đúng là LISP Bác viết có vẽ được Points. Thank you.

Chào bác Phiphi,

Bác chú ý là cái lisp của bác tdnv sẽ tạo ra text về kiểu, kích cỡ và góc nghiêng đúng với text đầu tiên mà bác chọn chứ không phải là tùy ý bác đâu nhé. Trong một số trường hợp cụ thể bác vẫn phải can thiệp vào lisp để có được text ưng ý đó.

Mặt khác cái điểm chuẩn mà bác tdnv chọn để nội suy không phải là điểm mang cao độ được ghi mà là điểm đặt của text ghi cao độ. Trong trường hợp các điểm đặt này được đặt tùy ý người thiết kế có thể dẫn tới kết quả nội suy không thực đúng như mong muốn. (ví dụ text1 đặt cao hơn điểm thực và text2 đặt thấp hơn điểm thực chẳng hạn)

Cách nội suy của bác tdnv khác với cách nội suy của mình. Bác tdnv nội suy theo hình chiếu vuông góc của điểm chọn trên đường nối hai điểm chuẩn. Còn mình nội suy theo hình chiếu song song với hướng trục đứng của điểm chọn trên đường nối hai điểm chuẩn.

Bác nên hiểu rõ điều này để chọn phương án nội suy phù hợp với yêu cầu của bác nhé.

 

Chúc bác vui và thành đạt.

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
phamthanhbinh    3.123
Thực ra bạn không cần phải nhập vào góc nghiêng và chiều cao chữ. Lấy luôn code dxf của text mình chọn lúc đầu cho tiện.

Thay vì dùng hàm (command "text" .....)

thì bạn dùng

(setq n1 (subst (cons 10 p) (assoc 10 n1) n1)

n1 (subst (cons 40 (rtos h 2 3)) (assoc 40 n1) n1))

(entmake n1)

 

Như vậy text mới được tạo ra giống text mẹ lúc đầu , chỉ khác vị trí code-10 và nội dung code-40

 

Chào bác cuongtk2,

Rất cám ơn bác đã truyền cho một chiêu mới trong việc dùng lisp. Tuy nhiên hình như bác có sự quên hay sao ấy. Đoạn code (assoc 40 n1) sẽ cho giá trị chiều cao text chứ không phải nội dung text. Để có nội dung text phải là (assoc 1 n1) chứ bác nhỉ.

Bác xem lại hộ mình tí nhé.

Chúc bác luôn vui vẻ và hạnh phúc.

  • 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
cuongtk2    40
Chào bác cuongtk2,

Rất cám ơn bác đã truyền cho một chiêu mới trong việc dùng lisp. Tuy nhiên hình như bác có sự quên hay sao ấy. Đoạn code (assoc 40 n1) sẽ cho giá trị chiều cao text chứ không phải nội dung text. Để có nội dung text phải là (assoc 1 n1) chứ bác nhỉ.

Bác xem lại hộ mình tí nhé.

Chúc bác luôn vui vẻ và hạnh phúc.

:cheers: Sorry, nhầm.

Tiện thể cho minh hỏi trong diễn đàn có ai biết về DoubleClick không vậy.

Ví dụ như mình DoubleClick vào text có nội dung "2%%C18" thì có thể dùng hàm lisp gì điều khiển chuỗi này để Edit nhạy ngữ cả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

Các bác pro ơi viết dùm em lísp khi click vào 2 điểm của hình chữ nhật bao quanh đối tượng cần tạo Block thì lísp sẽ tạo ra 1 Block có tên là tên file bản vẽ, điểm chèn là tâm của hình chữ nhật.

 

http://www.cadviet.com/upfiles/xe_hoi.dwg

 

Em xin cám ơn nhiều lắm.

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
cmengenie    0

Chỉ là 1 lời nhắn tới các bác phamthanhbinh, phiphi...lần trước nhiệt tình chỉ bảo em thôi, k có yêu cầu lần này.

Cácm ơn các bác, nhưng quả thực e rất gà về lisp khi các bác gợi ý em cái quả tính diện tích tổng của 1 loạt các polyline kín.

Em đã làm theo cách của bác gì là: cho chúng nó vào block rồi xem accumulative area :cheers:.

Hôm nay lại tìm thấy cách mới muốn share cho anh em chơi: các bác có thể dùng lệnh area thế này:

Area\chọn Add\ chọn Object thì CAD nó sẽ tự động liệt kê thuộc tính Total area của mấy cái mình chọn.

Thân.

Ps: đã tự mày mò viết xong cái lisp (vài dòng) cho loạt lệnh này :cheers:)

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
duy782006    1.376
Các bác pro ơi viết dùm em lísp khi click vào 2 điểm của hình chữ nhật bao quanh đối tượng cần tạo Block thì lísp sẽ tạo ra 1 Block có tên là tên file bản vẽ, điểm chèn là tâm của hình chữ nhật.

 

http://www.cadviet.com/upfiles/xe_hoi.dwg

 

Em xin cám ơn nhiều lắm.

Mình thấy bạn cũng đã tập viết lisp nên cái này đơn giản bạn nên tự viết theo gợi ý sau.

-Hỏi chọn điểm thứ nhất.

-Hỏi chọn điểm thứ hai.

-Tính toán ra điểm thứ 3 là trung điểm của 2 điểm vừa tạo.

-Gọi lệnh BLOCK chọn đối tượng bằng chế độ W điểm thứ nhất và điểm thứ 2. Tùy nhu cầu mà bạn tính toán chọn từ điểm trái qua pahỉ hay từ phải qua trái. điểm đặt là điểm thứ 3 mà bạn vừa tính được. Khi tạo xong đối tượng gốc mất đi nếu bạn muốn không mất thì thêm dòng gọi lệnh OOPS.

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
sucuph    1
Hình như bạn nhầm H/L thành L/H, bình thường nói mái dốc 60% hoặc 15% tức là tan(anpha)=0.60 = H/L

Đoạn code này có thể giúp bạn, trong Lisp ko có hàm tan, thường dùng sin/cos=tan, nếu cần cotan thì chỉnh lại nhé.

(defun c:gocdoc ( / ent p1 cao_text sp ep ang dodoc thap_phan)

(vl-load-com)

(setq ent (entsel "\nChon mai doc:"))

(setq cao_text 0.5

thap_phan 2

p1 (cadr ent)

ent (car ent)

sp (vlax-curve-getStartPoint ent)

ep (vlax-curve-getEndPoint ent)

ang (angle sp ep)

dodoc (* (abs (/ (sin ang) (cos ang))) 100)

dodoc (strcat (rtos dodoc 2 thap_phan) "%"))

(command "_.text" p1 cao_text 0 dodoc)

)

Em là dân thuỷ lợi, trong thuỷ lợi bọn em thưòng nói hệ số mái dốc là m=l/h, (vd hệ số mái đập m=3, m=3,5), em cảm ơn bác, em cũng đã sửa lại code theo ý muốn. Em có một ý muốn nhờ bác nữa đó là em muốn khi chọn đối tượng đo mái dốc thì sẽ hiện lên màn hình kết quả là đoạn text song song với mái dốc để ghi chú luôn cho mái dốc đó.Chờ tin bác. Cảm ơn bác và các anh em!

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
duy782006    1.376
Em là dân thuỷ lợi, trong thuỷ lợi bọn em thưòng nói hệ số mái dốc là m=l/h, (vd hệ số mái đập m=3, m=3,5), em cảm ơn bác, em cũng đã sửa lại code theo ý muốn. Em có một ý muốn nhờ bác nữa đó là em muốn khi chọn đối tượng đo mái dốc thì sẽ hiện lên màn hình kết quả là đoạn text song song với mái dốc để ghi chú luôn cho mái dốc đó.Chờ tin bác. Cảm ơn bác và các anh em!

Có 1 cách để viết text góc quay theo đối tượng vừa chọn là bạn dùng UCS lựa chọn ob thực hiện lệnh text xong thì UCS lựa chọn p để trả về là xong.

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
sucuph    1
Có 1 cách để viết text góc quay theo đối tượng vừa chọn là bạn dùng UCS lựa chọn ob thực hiện lệnh text xong thì UCS lựa chọn p để trả về là xong.

nhờ các bác viết luôn hộ code đi, em chỉ biết sửa mấy thu đơn giản thôi chứ viết thì em chịu.Các bác giúp em nha.

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ách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×