VoHoan
-
Số lượng nội dung
166 -
Đã tham gia
-
Lần ghé thăm cuối
-
Ngày trúng
1
Bài đăng được đăng bởi VoHoan
-
-
3 giờ trước, tannguyen291 đã nói:Theo đoạn lisp trên của bác tannguyen291 là cơ bản xử lý gọn công việc của mình rồi. Rất cảm ơn các bác nhiệt tình trao đổi. Chúc các bác cuối tuần vui vẻ!
-
3 giờ trước, Doan Van Ha đã nói:Có cảm giác chủ topic đặt câu hỏi mà không nghĩ hết các trường hợp xãy ra?
Và không biết là lấy những điểm vuông góc đặc biệt ấy để làm gì, hay chỉ đặt ra vậy thôi (vì câu hỏi quá ngắn gọn)?Vì áp dụng vào công việc nên pl chủ yếu là đường Pline chứ ko nghĩ là mình đưa ra trường hợp tổng quát vậy. Các bác giải quyết bài toán là đường Pline là được ạ, còn các trường hợp đặc biệt khi dùng lisp thì mình sửa thủ công thôi.
- 1
-
Trách gì thấy sai sai mà bận quá chưa kt lại. Giờ muốn cả trường hợp điểm N nằm ngoài pl thì ntn nào các bác?
- 2
-
16 giờ trước, Doan Van Ha đã nói:(setq q (vlax-curve-getClosestPointTo pl p))
Hic. Đơn giản và hiệu quả. Cảm ơn bác nhiều.
-
Nhờ bác nào viết giúp hàm con mà đầu vào cho 1 điểm P nằm ngoài đường pline pl, tìm điểm N là chân đoạn thẳng vuông góc từ P đến pl, nếu có nhiều điểm N thì chọn điểm mà chiều dài đoạn PN là nhỏ nhất.
Xin cảm ơn!.
-
26 phút trước, cuongtk2 đã nói:(defun pline-setvetex-at (pline n x y / NEW_COORD1) (setq new_coord1 (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble '(0 . 1)) (list x y) ) ) ) (vla-put-coordinate pline n new_coord1) ) (defun c:test () (setq pline (vlax-ename->vla-object (car (entsel "\nChon pline"))) n (getint "\nThu tu dinh") pt (getpoint "\nVi tri moi:") ) (pline-setvetex-at pline n (car pt) (cadr pt) ) )
Trên quan điểm lập trình thì code trước không sai vì mình làm hoàn toàn đúng theo quy trình, nhưng vì nó sai nên mình chết dúng quy trình.
Mò mãi mới tìm ra được mấy cái variant, safearray fill, test thấy OK, mặc dù không hiểu lắm
Kết quả ntn là ổn với yêu cầu của mình rồi, cảm ơn cac bác đã đóng góp ý kiến.
-
2 phút trước, 7o7 đã nói:Tại bác @cuongtk2 thay toàn bộ các đỉnh có toạ độ xy bằng x1y1, chứ không tính vị trí đỉnh n.
Có phải đoạn này làm nó sai: (change_pline_position pline n (car p1) (cadr p1))
Vậy viết lại đoạn code này ntn vây?
-
Vào lúc 14/3/2023 tại 09:32, Duong Nhat Duy đã nói:Do hatch của bạn bị lỗi, trong Properties cũng ko hiện diện tích thì lisp nó ko tính được. Hatch lỗi thì nhiều lí do lắm, có thể do đường bao bị trùng nét, ...
Cách giải quyết: Hiện đường bao hatch lên, join vào (nếu ko kín) rồi tính diện tích cái đường bao đó = lệnh DT3
Mình hay dùng để kiểm tra diện tích trắc ngang thường bị lỗi này, giờ có thể bổ sung thêm tính năng khắc phục được nhược điểm này không nhỉ.
-
9 phút trước, 7o7 đã nói:Mọi đỉnh trùng nhau đều bị di chuyển, chứ kp chỉ đỉnh thứ n.
Ngoài ra nếu là đỉnh cung tròn tuy có di chuyển nhưng đường cong chưa chỉnh lại nên ko dc trơn tru.
Nhưng đòi hỏi ct như vậy thì quá mệt cho người viết.
Đúng như vậy, mình sửa đường tự nhiên nên ít có trường hợp như trên nên ko phát hiện ra.
Mà thuật toán là truy xuất thứ tự của phần tử trong list ls chứa tọa độ đỉnh mà nhỉ, hay cấu trúc của list ls có gì khác biệt không?
-
5 phút trước, cuongtk2 đã nói:Với pline có 4 đỉnh
(setq ls (vlax-get obj 'Coordinates)) => ls = (x0 y0 x1 y1 x2 y2 x3 y3), ls length = 8
giả sử mình put vào đỉnh thứ
n=0 (x0 y0) tương đương với (n * 2; n * 2 +1) = (0; 1) của ls
n=3 (x3 y3) tương đương với (n * 2; n * 2 +1) = (6; 7) của ls
OK. đã hiểu cách dùng của bác.
Chúc bác sức khỏe.
-
2 giờ trước, cuongtk2 đã nói:;;; pline : entity ;;; n : int < so dinh cua pline ;;; x : real ;;; y : real (defun change_pline_position (pline n x y / LS OBJ PLINE) (setq obj (vlax-ename->vla-object pline)) (setq ls (vlax-get obj 'Coordinates)) (if (> n (- (/ (length ls) 2) 1)) (progn (alert "n Qua gio han so dinh pline") (exit) ) ) (setq ls (subst x (nth (* n 2) ls) ls) ls (subst y (nth (+ (* n 2) 1) ls) ls) ) (vlax-put obj 'Coordinates ls) ) (defun c:test () (setq pline (car (entsel "\nChon pline")) p1 (getpoint "\nPick vi tri dinh") n (getint "\nVi tri")) (change_pline_position pline n (car p1) (cadr p1)) )
Đây nhé
OK rồi bác à, nhưng cho hỏi là sao
(if (> n (- (/ (length ls) 2) 1)) ; n phải chia 2 nhỉ và
(setq ls (subst x (nth (* n 2) ls) ls) ; đoan này là lấy tọa gí trị x của nút thứ n*2 à
ls (subst y (nth (+ (* n 2) 1) ls) ls) ;đoan này là lấy tọa gí trị y của nút thứ n*2+1 , sao không phải là giá trị của n*2?
) ;Cảm ơn bác nhiều
-
11 phút trước, Doan Van Ha đã nói:Vậy thì nên xem lại cách đặt câu hỏi của bạn. Khá hời hợt.
Mình nói cũng khá chi tiết rồi mà, còn nếu theo các bước thực hiện thì như sau:
1. Quét chọn các đường pline.
2. Với mỗi pline thay tọa độ nút thứ n(X Y) thành n(X1 Y1) và cập nhật lại đường pline đo (tọa độ n(X1 Y1) và n đã biết được).
- 1
-
Vừa xong, Doan Van Ha đã nói:Nếu 1 pline thay đổi 1 point thì Cad nhanh hơn Lisp
Chừng trăm cái pline thì lisp nhanh hơn!?
Tọa độ n(X1 Y1) không phải có sẵn mà phải tính ra nên mình có xào lại cái lisp mà mắc đoạn code này.
-
4 giờ trước, CadExTools đã nói:Mình cần đoạn code để lắp vào cái lisp xào nấu bạn a.!
-
5 giờ trước, Doan Van Ha đã nói:Chỉ cần pick vào nút đó >> rê chuột >> nhập tọa độ mới là nó thay đổi, chứ lisp làm gì.
Vì nhiều đường Pline thì mới dùng đến lisp cho nó nhanh mà.
-
Nhờ bác nào viết giúp đoạn lisp như tiêu đề: Mình có đường Pline P giờ muốn đổi tọa độ của nút thứ n(X Y) về tọa độ mới n(X1 Y1). Lưu ý là không phải vẽ lại đường Pline mới mà cập nhật tọa độ nút n(X1 Y1) vào P nhé (P là đối tượng của phần mềm thiết kế đường, để không làm mất thuộc tính của P).
Xin cảm ơn!.
-
8 phút trước, Doan Nguyen Van đã nói:Ý bạn là thế này?
Đúng rồi bạn à.
-
5 phút trước, Doan Nguyen Van đã nói:Oke chứ nhỉ
Gần đúng bạn à. Nhưng các cung tròn trong clip chưa phải tiếp xúc với đường L1, L2 mà chỉ là các cung tròn cắt qua 2 điểm mình chọn (cái này sai ý mình là dạng tiếp tuyến).
-
38 phút trước, 7o7 đã nói:Cái này dùng lisp còn khó hơn vẽ tay. Chỉ cần offset 2 pline theo bk sẽ xác định tâm vt, vẽ vt, trim ( chắc chắn là tiếp xúc), xong.
Vấn đề của mình về thuật toán thì không khó, chỉ là tìm 2 điếm tiếp xúc và vẽ cung tròn với lựa chọn 2 điểm và bán kính. Cái khó là code viết sao cho nhanh và khoa học thôi, cái này thì chắc phải cần các bác pro ra tay.
-
Lisp này chắc giải quyết đúng ý đồ của mình, bạn có thể cho test thử được không vậy. Vì các đường Pline của mình có thể gãy khúc nên vị trí tiếp xúc và bán kính có nhiều lựa chọn.
-
Cái trên chắc không phù hợp vì cách thức thực hiện của mình nó đòi hỏi thực tế với mặt bằng tuyến, mà không có lisp nên không kt có chạy được không.
-
Mình làm bình đồ tuyến giao thông, khi vuốt các đường giao thường tao cung tròn bo góc. Các bước mình có miêu tả trong file ví dụ gửi kèm như sau:
Bước 1: tạo đường tròn với lựa chọn "TTR" tiếp xúc với 2 đường Pline L1, L2 (2 đường này có thể gãy khúc) với bán kính phù hợp (bán kính phù hợp còn phụ thuộc điếm tiếp xúc). Nên có thể phải vẽ nhiều lần đường tròn để phù hợp với thực tế mặt bằng tuyến.
Bước 2: Dùng lệnh "trim" để cắt tạo cung tròn. Nhưng do không phải lúc nào cũng cắt được (chắc do đường L1, L2 hoặc do điểm tiếp xúc nhưng chưa chạm L1 L2) nên mình phải thêm bước phụ để cắt (có miêu tả trong file VD).
Giờ mình muốn viết 1 lisp với các bước thực hiện như sau:
- Bước 1: Lệnh lisp "Bogoc" lựa chọn đường L1, L2, (khi chọn L1, L2 thì vị trí chọn là vị trí tiếp xúc với đường tròn) nhập bán kính để tạo đường tròn.
- Bước 2: Nếu phù hợp thì "enter" tạo cung tròn, chưa ưng ý thì quay lại bước 1.
Xin cảm ơn trước các bác xem giúp đỡ.
-
Vào lúc 23/5/2020 tại 11:15, Cadviet01 đã nói:"Thêm tính năng donate ae góp cho ít vui nhà vui cửa :D "
Trên diễn đàn CadViet cũng có mấy lisp cho dùng thử và mất phí khi dùng bản đầy đủ, nhưng lisp này thì không mà lại rất hay.
Cho nên muốn ủng hộ chủ thớt chút ít, bạn nên để số TK ngân hàng để ai ủng hộ thì gửi chút bia lạc nhỉ.
- 3
-
1 giờ trước, quocmanh04tt đã nói:(entmod (append (entget (tblobjname "LAYER" layer_name))
(list (cons 62 color) (cons 6 linetype))))OK. Đúng như ý mình cần, cảm ơn quocmanh04tt nhé
(Yêu cầu) Xuất lý trình cho từng đối tượng
trong AutoLisp
Đã đăng · Trả lời báo cáo
Nếu bạn có phần mềm thiết kế đường TDT thì lựa chọn lệnh "cong" để điền lý trình cống cho các vạch sơn đó cũng được.
Mà làm mặt bằng ATGT vạch sơn cũng phải ghi chi tiết lý trình vậy!?