Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
VoHoan

Thay đổi tọa độ nút đường Pline

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

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

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

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
4 phút trước, VoHoan đã nói:

Vì nhiều đường Pline thì mới dùng đến lisp cho nó nhanh mà.

Nếu 1 pline thay đổi 1 point thì Cad nhanh hơn Lisp

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

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
3 phút trước, VoHoan đã nói:

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.

Vậy thì nên xem lại cách đặt câu hỏi của bạn. Khá hời hợ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
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

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
;;; 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é

  • 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
48 phút trước, Doan Van Ha đã nói:

Hình như yêu cầu và đáp ứng không ăn nhập gì nhau?

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

(change_pline_position pline n X1 Y1)

Em đã đáp ứng yêu cầu rồi mà. Vậy bác định như thế nào cho đúng để em viết lại.

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

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

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

n>3 => vô nghiệ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
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.

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
53 phút trước, ndtnv đã nói:

Chương trình sai khi pline có nhiều đỉnh cùng x hoặc y

 

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.

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

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
30 phút trước, VoHoan đã nói:

Đú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?

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. Bác ý không nên dùng hàm subst.

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

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

Nếu pline của bạn không có điểm trùng và không có đường cong thì dùng cái lisp của bác cuongtk2 là ok rồi, không cần thiết dùng của LM làm gì cho nặng thêm ra. Bác chỉ cần 1 đoạn code ngắn thôi 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
(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

  • 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
Đăng nhập để thực hiện theo  

×