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ị

phamthanhbinh    3.123
Em thấy bác dùng dimaligned cho tất cả trường hợp thì không ổn lắm nên chăng kiểm tra nếu line nằm ngang hoặc dọc thì cho nó cái dimline còn xiên thì hãy dùng dimaligned

Chào bác Duy782006,

Đúng như bác nói, tại mình lười check line mà thấy dùng cái dimaligned cho cả các đường ngang dọc đều được nên để như vậy. Vả lại lisp này mới chỉ để thử xem có đúng yêu cầu của bạn dacphuong hay không rồi mới hoàn chỉnh sau. Mình cũng thấy để hoàn chỉnh nó còn khá nhiều vấn đề như:

1/- Với các polyline, lwpolyline nữa thì chọn bộ chọn ss ra sao?

2/- Khi có nhiều line thì việc lựa chọn và bố trí đường kich thước sao cho hợp lý nhất là cả một bài toán khó xơi.

3/- Mình đang định thay đổi phương án lấy bộ lựa chọn ss để người dùng can thiệp vào quá trình lựa chọn nữa

4/- Với các đối tượng khác như arc, circle,... ghi kích thước ra sao?

5/- Cho người dùng tự chọn vị trí đặt đường kích thước hợp lý, muốn thế phải xác định được trật tự của các đối tượng trong bộ chọn.

Bác Duy và các bác khác xem góp ý với mình nhé.

Xin chân thà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
nataca    553
Bác thử lại file PP post ntn nhé, khoảng cách các điểm không cho ra đúng kích thước thật (20 unit). Thanks you

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

Thui chít. Nhầm 1 tý. Mình sửa lại rồi. Không để ý. Xin lỗi 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
duy782006    1.373
Chào bác Duy782006,

Đúng như bác nói, tại mình lười check line mà thấy dùng cái dimaligned cho cả các đường ngang dọc đều được nên để như vậy. Vả lại lisp này mới chỉ để thử xem có đúng yêu cầu của bạn dacphuong hay không rồi mới hoàn chỉnh sau. Mình cũng thấy để hoàn chỉnh nó còn khá nhiều vấn đề như:

1/- Với các polyline, lwpolyline nữa thì chọn bộ chọn ss ra sao?

2/- Khi có nhiều line thì việc lựa chọn và bố trí đường kich thước sao cho hợp lý nhất là cả một bài toán khó xơi.

3/- Mình đang định thay đổi phương án lấy bộ lựa chọn ss để người dùng can thiệp vào quá trình lựa chọn nữa

4/- Với các đối tượng khác như arc, circle,... ghi kích thước ra sao?

5/- Cho người dùng tự chọn vị trí đặt đường kích thước hợp lý, muốn thế phải xác định được trật tự của các đối tượng trong bộ chọn.

Bác Duy và các bác khác xem góp ý với mình nhé.

Xin chân thành cám ơn nhiều.

Lúc xưa em cũng tính làm cái lisp kiểu này nhưng vướng mấy điểm bác nêu (khó nhất là vị trí đặt dim) nên bỏ ý định 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
ssg    1.088
Thui chít. Nhầm 1 tý. Mình sửa lại rồi. Không để ý. Xin lỗi nha

Chưa hết lỗi bạn ơi:

1. Bạn sửa xong nó trở lại lỗi hôm trước: "malformed string on input" (cái này thì đơn giản, chắc là nhầm một chút ở đâu đó)

2. Với (command "line" Fp (list (car Ep) (cadr Fp)) "") -> chia theo trục X thì OK. Nhưng nếu theo trục Y thì bạn chưa xử lý.

 

Ngoài ra, ssg có thêm vài ý kiến:

1. Dùng "measure" kết hợp với "xline" để lấy giao điểm là ý rất hay :cheers:

2. Với (command "measure" Nent kcach), thao tác chia luôn luôn bắt đầu từ đầu mút có X (hoành độ) nhỏ hơn, bất kể là chia theo X hay theo Y. Quy luật đó có phải lúc nào cũng phù hợp với ý muốn của user? Theo ssg, nên thêm vào phần nhập liệu: user chỉ định điểm mút làm chuẩn để bắt đầu chia.

 

P/S

vlax-curve-getStartPoint và vlax-curve-getEndPoint chấp nhận argument là entity -> không cần phải dùng vlax-ename->vla-object

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

Chào bạn phamthanhbinh. Mình đã sửa lại lisp của bạn nhưng vẫn có lỗi: ; error: bad argument type: lselsetp nil. Bạn xem giúp lại mình 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
ssg    1.088
Chào bác Duy782006,

Đúng như bác nói, tại mình lười check line mà thấy dùng cái dimaligned cho cả các đường ngang dọc đều được nên để như vậy. Vả lại lisp này mới chỉ để thử xem có đúng yêu cầu của bạn dacphuong hay không rồi mới hoàn chỉnh sau. Mình cũng thấy để hoàn chỉnh nó còn khá nhiều vấn đề như:

1/- Với các polyline, lwpolyline nữa thì chọn bộ chọn ss ra sao?

2/- Khi có nhiều line thì việc lựa chọn và bố trí đường kich thước sao cho hợp lý nhất là cả một bài toán khó xơi.

3/- Mình đang định thay đổi phương án lấy bộ lựa chọn ss để người dùng can thiệp vào quá trình lựa chọn nữa

4/- Với các đối tượng khác như arc, circle,... ghi kích thước ra sao?

5/- Cho người dùng tự chọn vị trí đặt đường kích thước hợp lý, muốn thế phải xác định được trật tự của các đối tượng trong bộ chọn.

Bác Duy và các bác khác xem góp ý với mình nhé.

Xin chân thành cám ơn nhiều.

Ssg cũng có ý kiến như bạn Duy: Autodim "khó chơi" lắm! Bạn "vọc" với SolidWorks thì biết rồi đó, user phải luôn luôn chỉnh sửa lại, không những vị trí đặt dim mà còn chuẩn kích thước, cân nhắc xem cái nào nên ghi cái nào không...

Nếu bạn thật sự có hứng thú, có thể tham khảo thêm một chút về cái lisp AD mà ssg đã post ở đây:

 

http://www.cadviet.com/forum/index.php?sho...205&st=1420

 

(ssg chỉ viết để đáp ứng một yêu cầu cụ thể chứ không có ý định phát triển nó).

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
Chào bạn phamthanhbinh. Mình đã sửa lại lisp của bạn nhưng vẫn có lỗi: ; error: bad argument type: lselsetp nil. Bạn xem giúp lại mình nhé. Cám ơn nhiều.

Chào bạn dacphuong,

Quả thực là mình cũng không hiểu bạn ạ. Mình chạy trên cad2004 của mình thì không thấy vấn đề gì cả. Thậm chí mình đã vẽ hàng chục line cũng được mà. Chỉ tội hơi rối mắt vì cái vị trí của đường kích thước không như ý mình thôi.

Bạn có thể tham khảo bài viết của các bác Duy, SSG về vấn đề này sẽ hiểu rõ hơn cái lisp của mình.

Theo lỗi thông báo thì hình như là bạn đã vẽ các line bằng lệnh pline thì phải. Bạn kiểm tra lại nhé. Lisp của mình chỉ chạy được khi trên bản vẽ có các line vẽ bằng lệnh line thôi bạn ạ. Nếu với cả lwpolyline thì dùng lisp của bác SSg sẽ OK hơn. Mình cũng đang tham khảo lisp của bác ấy để hoàn thiện cái lisp của mình.

Chúc bạn vui và 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
gia_bach    1.442
Chào bạn dacphuong,

Bạn dùng thử đoạn code sau đây xem sao:

(defun c:dm ()
(setq ss (ssget "x" (list (cons 0 "line"))))
.............................................
		 (Command "dimaligned" fp ep (list (+ (car fp) 10) (+ (cadr fp) 10)) "")
)
(princ)
)

....................

Chào bạn Phamthanhbinh,

Mình có vài góp ý :

- dòng (setq ss (ssget "x" (list (cons 0 "line")))) sẽ chọn tất cả các đường thẳng trong bản vẽ. Nhu cầu thông thường của User là click chọn đối tượng trong cửa sổ và lệnh dimaligned chỉ cho phép chọn đối tượng trên TAB hiện hành -> mình đề nghị đổi thành :

(setq ss (ssget (list (cons 410 (getvar "ctab")) (cons 0 "line"))))

- dòng (Command "dimaligned" fp ep (list (+ (car fp) 10) (+ (cadr fp) 10)) "") không cần 2 dấu nháy cuối cùng

-> (Command "dimaligned" fp ep (list (+ (car fp) 10) (+ (cadr fp) 10)) )

Chúc sức khỏe.

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

Mình là dân Thủy Lợi, cứ mỗi lần vẽ Trắc dọc, trắc ngang kênh mương là mình lại thấy ớn. Vì cứ một cái kênh, một tuyến kè là có ít nhất 50 mặt cắt. Vẽ mấy rất mệt. Mình muốn nhờ gia đình Cadviet viết hộ mình một cái lisp mà chỉ cần nhập số thôi là nó sẽ tự động vẽ cho mình ở trên cad. Và mẫu được thể hiện ở file dưới đây:

 

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

 

Mình đã chuyển sang cad 2004 rồi. Ah, file trước mình gửi nhầm

Xin chân thành cảm ơn các bạn!

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
Mình là dân Thủy Lợi, cứ mỗi lần vẽ Trắc dọc, trắc ngang kênh mương là mình lại thấy ớn. Vì cứ một cái kênh, một tuyến kè là có ít nhất 50 mặt cắt. Vẽ mấy rất mệt. Mình muốn nhờ gia đình Cadviet viết hộ mình một cái lisp mà chỉ cần nhập số thôi là nó sẽ tự động vẽ cho mình ở trên cad. Và mẫu được thể hiện ở file dưới đây:

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

Xin chân thành cảm ơn

Ới Bác Quanvuong ơi,

Cái file bác gửi em không mở được. Bác có thể chuyển nó về cad2004 được không? Cho em mót tí mà.

Cám ơn bác.

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
Chào bạn Phamthanhbinh,

Mình có vài góp ý :

- dòng (setq ss (ssget "x" (list (cons 0 "line")))) sẽ chọn tất cả các đường thẳng trong bản vẽ. Nhu cầu thông thường của User là click chọn đối tượng trong cửa sổ và lệnh dimaligned chỉ cho phép chọn đối tượng trên TAB hiện hành -> mình đề nghị đổi thành :

(setq ss (ssget (list (cons 410 (getvar "ctab")) (cons 0 "line"))))

- dòng (Command "dimaligned" fp ep (list (+ (car fp) 10) (+ (cadr fp) 10)) "") không cần 2 dấu nháy cuối cùng

-> (Command "dimaligned" fp ep (list (+ (car fp) 10) (+ (cadr fp) 10)) )

Chúc sức khỏe.

Chào bác Giabach,

Rất cám ơn bác đã tận tình hướng dẫn tôi và mọi người những điều rất bổ ích về lisp trong thời gian vừa qua. Vì là người mới học và lại là học mót nữa, tôi còn đang trên cái bước chập chững để viết lisp nên sự hướng dẫn, chỉ bảo của những bậc tiền bối về lisp như bác và các bác khác trên diễn đàn là cực kỳ quan trọng để tránh được những sai lầm chết người do chủ quan của người viết lisp, cũng như do cái sự hiểu chưa đến nơi đến chốn của người viết lisp.

Rất mong bác luôn mạnh khỏe, yêu đời để tôi và các anh em khác còn có chỗ để mót.

Chào bác.

  • 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
baodenhp    0

Mình đang phải tính khối lượng nạo vét, bác nào có file lisp để lên mặt cắt co thể share mình được ko. Mình đang dùng phần mềm acad land desktop 2008 để lên mặt cắt nhưng mặt cắt xuất ra lại ko giống như trong các hố sơ tính toán nạo vét. Mình thấy bên ngoài dùng rất nhiều file Lisp để lên mặt cắt nhưng tiếc là mình ko có cái nào :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
nataca    553
Mình đang phải tính khối lượng nạo vét, bác nào có file lisp để lên mặt cắt co thể share mình được ko. Mình đang dùng phần mềm acad land desktop 2008 để lên mặt cắt nhưng mặt cắt xuất ra lại ko giống như trong các hố sơ tính toán nạo vét. Mình thấy bên ngoài dùng rất nhiều file Lisp để lên mặt cắt nhưng tiếc là mình ko có cái nào :cheers:

Bạn cho một file ví dụ cụ thể xem nào. Nói thực là mình không hiểu bạn đang mô tả cái gì và cái lisp mà bạn nói là "rất nhiều" nó làm như thế nào. Tốt nhất bạn cứ đưa file minh họa lên mọi người mới có thể hiểu và giúp bạn được

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

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.373
Em muốn hoán đổi vị trí hai đối tượng(nhóm đối tượng)cho nhau khi có 2 điểm làm chuẩn . Bác nào viết giúp em cái lisp này với. THANK!!!!!!!!!!!!

Đây bạn!

(defun c:dc ( )

(command "undo" "be")

(Prompt "\nChon nhom doi tuong thu nhat")

(Setq doituong1 (Ssget))

(Prompt "\nChon nhom doi tuong thu hai")

(Setq doituong2 (Ssget))

(setq a (getpoint "Chon diem chuan thu nhat: "))

(setq b (getpoint a"Chon diem chuan thu hai: "))

(setq luubatdiem (getvar "osmode"))

(setvar "osmode" 0)

(command ".move" doituong1 "" a b)

(command ".move" doituong2 "" b a)

(setvar "osmode" luubatdiem)

(command "undo" "end")

(Prin 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
phamthanhbinh    3.123
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

Chào bác Phiphi,

Căn cứ vào bản vẽ bác post, mình thử viếp cái lisp này, không biết có đúng ý bác không. Bác xài thử rồi cho mình biết ý kiến để bổ sung nhé.

(defun c:vd ()
(setq olmode (getvar "pdmode"))
(setvar "pdmode" 3)
(setq p1 (getpoint "\n Chon diem chuan thu nhat: "))
(setq p2 (getpoint "\n Chon diem chuan thu hai: "))
(setq goc (angle p1 p2))
(setq a (/ (sin goc) (cos goc)))
(setq p3 (getpoint "\n Chon diem muon noi suy: "))
(setq p4 (list (car p3) (+ (cadr p1) (* a (- (car p3) (car p1))))))
(command "point" p4)
(setvar "pdmode" olmode)
(command "text" (list (car p4) (+ 5 (cadr p4))) "" 45 (cadr p4) "")
(princ)
)

 

Bác có thể thay đổi chiều cao text , góc nghiêng text cũng như điểm đặt của text tùy theo ý bác bằng cách sửa lại dòng code (command "text" (list (car p4) (+ 5 (cadr p4))) "" 45 (cadr p4) "")

Việc bác muốn chọn một lần nhiều điểm nội suy sẽ hơi phức tạp hơn. Ở lisp này chỉ cho bác nội suy mỗi lần một điểm. Nếu bác muốn làm nhiều điểm thì phải làm nhiều lần.

Do trình độ còn hạn chế nên chưa thể đáp ứng ngay yêu cầu của bác. Mong bác thông cảm và chờ thêm ít bữa nữa. Bác dùng thử và cho ý kiến nhé.

 

Chúc bác vạn sự 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
phamthanhbinh    3.123
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.

Chào bác Phiphi.

Cái lisp này có cải tạo một chút cho phép bác nhập một lần nhiều điểm cần nội suy, nhưng bác phải nhập số lượng điểm cần nội suy trước và sau đó thực hiện đủ số lần chọn các điểm này. Mỗi khi chọn điểm xong là lisp sẽ tự ghi kết quả cho điểm vừa chọn.

Rất mong nó hợp với ý bác.

(defun c:vd ()
(setq olmode (getvar "pdmode"))
(setvar "pdmode" 3)
(setq p1 (getpoint "\n Chon diem chuan thu nhat: "))
(setq p2 (getpoint "\n Chon diem chuan thu hai: "))
(setq goc (angle p1 p2))
(setq a (/ (sin goc) (cos goc)))
(setq n (getint "\n Nhap so luong diem can noi suy: "))
(setq i 0)

(while ((setq p3 (getpoint "\n Chon diem muon noi suy: "))
(setq p4 (list (car p3) (+ (cadr p1) (* a (- (car p3) (car p1))))))
(command "point" p4)
(command "text" (list (car p4) (+ 5 (cadr p4))) "" 45 (cadr p4) "")
(setq i (1+ i))
)

(setvar "pdmode" olmode)
(princ)
)

 

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
duy782006    1.373
Chào bác Phiphi.

Cái lisp này có cải tạo một chút cho phép bác nhập một lần nhiều điểm cần nội suy, nhưng bác phải nhập số lượng điểm cần nội suy trước và sau đó thực hiện đủ số lần chọn các điểm này. Mỗi khi chọn điểm xong là lisp sẽ tự ghi kết quả cho điểm vừa chọn.

Rất mong nó hợp với ý bác.

 

Chúc bác vui.

Anh Bình! việc bắt buộc người dùng nhập trước số điểm cần thực hiện trong lisp này là hơi gò bó ạn nghiên chứu hàm While với không đối số xem.

 

(while

(setq a (getpoint "\nChon diem : "))

đoạn thực hiện

)

 

Anh cho thực hiện đoạn đầu như của anh đến đoạn lặp anh làm như Duy phía trên có tác dụng nếu anh chọn 1 điểm thì nó gán cho a nếu anh enter thì nó kết thúc vòng lặ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
Chào bác Phiphi.

Cái lisp này có cải tạo một chút cho phép bác nhập một lần nhiều điểm cần nội suy, nhưng bác phải nhập số lượng điểm cần nội suy trước và sau đó thực hiện đủ số lần chọn các điểm này. Mỗi khi chọn điểm xong là lisp sẽ tự ghi kết quả cho điểm vừa chọn.

Rất mong nó hợp với ý bác.

...

Chúc bác vui.

Thanks bác Phamthanhbinh rất nhiều.

Như trong b/v PP post, LISP sẽ yêu cầu pick 2 chữ số (13.627 và 20.329) trước, sau đó rê mouse vào 1 vị trí nào đó tương đối thẳng hàng với 2 chữ số vừa pick, Lisp sẽ tính toán và viết ra chữ số mới dựa theo phương pháp tam giác đồng dạng.

Nhờ Bác check lại giúp nhé. PP vừa thử nhưng LISP chưa cho ra đúng kết quả Bác ạ.

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
Thanks bác Phamthanhbinh rất nhiều.

Như trong b/v PP post, LISP sẽ yêu cầu pick 2 chữ số (13.627 và 20.329) trước, sau đó rê mouse vào 1 vị trí nào đó tương đối thẳng hàng với 2 chữ số vừa pick, Lisp sẽ tính toán và viết ra chữ số mới dựa theo phương pháp tam giác đồng dạng.

Nhờ Bác check lại giúp nhé. PP vừa thử nhưng LISP chưa cho ra đúng kết quả Bác ạ.

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))

)

)

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

...

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

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
Thanks bác Phamthanhbinh rất nhiều.

Như trong b/v PP post, LISP sẽ yêu cầu pick 2 chữ số (13.627 và 20.329) trước, sau đó rê mouse vào 1 vị trí nào đó tương đối thẳng hàng với 2 chữ số vừa pick, Lisp sẽ tính toán và viết ra chữ số mới dựa theo phương pháp tam giác đồng dạng.

Nhờ Bác check lại giúp nhé. PP vừa thử nhưng LISP chưa cho ra đúng kết quả Bác ạ.

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.

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.

×