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

VoHoan

Thành viên
  • 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


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

    • Vote giảm 1

  2. 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.


  3. 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ỉ.


  4. 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. 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.


  6. 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


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

     

    • Vote giảm 1

  8. 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!.


  9. 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.


  10. 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 đỡ.

    Vi du.dwg


  11. 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ỉ.

     

     

    • Like 3
×