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

Phamdung01

Thành viên
  • Số lượng nội dung

    18
  • Đã tham gia

  • Lần ghé thăm cuối

  • Ngày trúng

    1

Bài đăng được đăng bởi Phamdung01


  1. 4 giờ trước, ngothanhduy đã nói:

    Chào bác chủ lips... em đã test lips của bác, và em có đóng góp như thế này:

    - Bác có thể thêm lựa chọn có hoặc không có dấu thập phân (có nghĩa là 3500 thì có thể lựa chọn là  3.500 hoặc 3,500 tuỳ định dạng).

    - Bác có thể thêm chữ L= trước giá trị text xuất ra.

     

    em cũng có 1 topic đang hỏi vấn đề trên ở trên diễn đàn mà chưa có kết quả như em mong muốn, nếu được bác có thể hoàn chỉnh thêm lips của bác được không ạ?

    Thanks bác!

    P/S: bên dưới là link em đăng topic để hỏi vấn đề tương tự ạ?

     

    Mình đang dùng điện thoại nên k test dc lisp

    Thêm chuỗi "L = " vào trước (rtos len 2 0)

    Còn 3500 mà thành 3.500 thì không phải là thập phân đâu bạn ạ, 3500.00 mới là thập phân

    • Like 1

  2.  

    Không hiểu rõ ý hàm con của bạn lắm

    Nhưng bạn có thể dùng hàm vlax-obj-getparamatpoint để tìm param tại điểm trên pline. Dùng hàm fix để làm tròn param . Sau đó lại dùng hàm vlax-obj-getpointatparam để lấy tọa độ đỉnh kế tiếp. Không biết mình viết đúng hàm không vì đang dùng đthoai. Nhưng về ý tuỏng là như thế


  3. 4 phút trước, Chiron đã nói:

    @ketxu test thử bị lỗi:

    ...

    Select objects:  Số số lẻ <2>:

    Select objects:
    ; error: bad argument type: VLA-OBJECT nil

    sau khi nhập số lẻ xong thì bạn phải chọn vào cái text mà nó không nằm trong thành phần cộng mới không lỗi. tức là chọn text a, text b, text c ... nhấn enter, chọn số lẻ, rồi chọn vào text n chứ không dc chọn vào text a hoặc b hoặc c...


  4. (defun C:td1 ()
    (setq d (vlax-ename->vla-object (car (entsel))))
    
    (cond
    
    ((=(vla-get-ObjectName d) "AcDbPolyline")
    (progn
    (while (setq e (getpoint))
    (setq e (vlax-curve-getClosestPointToProjection d e '(0 0 1)))
    (setq param (vlax-curve-getParamAtPoint d e))
    (setq param (+ (fix param) 1))
    (setq e (vl-remove (last e) e))
    (vlax-invoke d 'AddVertex Param e)
    )))
    
    
    
    ((=(vla-get-ObjectName d) "AcDb3dPolyline")
    (progn
    (while (setq e (getpoint))
    (setq endparam (vlax-curve-getEndParam d))
    (setq dsparam nil)
    (while (>= endparam 0)
    (setq dsparam (append dsparam (list endparam)))
    (setq endparam (1- endparam))
    )
    (setq e (vlax-curve-getClosestPointToProjection d e '(0 0 1)))
    (setq param (vlax-curve-getParamAtPoint d e))
    (setq dsparam (append dsparam (list param)))
    (setq dsparam (vl-sort dsparam '>))
    (setq dspoint nil)
    (foreach tam dsparam
    (setq e (vlax-curve-getPointAtParam d tam))
    (setq dspoint (append e dspoint))
    );foreach
    (vlax-put d 'coordinates dspoint)
    )))
    
    
    
    ((=(vla-get-ObjectName d) "AcDbSpline")
    (progn
    (while (setq e (getpoint))
    (setq e (vlax-curve-getClosestPointToProjection d e '(0 0 1)))
    (setq dsfit (vlax-get d 'fitpoints))
    (setq dsfit2 nil)
    (while dsfit
    (setq dsfit2 (cons (list (car dsfit) (cadr dsfit) (caddr dsfit)) dsfit2))
    (setq dsfit (cdddr dsfit))
    )
    (setq dsparam (mapcar '(lambda (a) (vlax-curve-getparamatpoint d a)) dsfit2))
    (setq dsparam (cons (vlax-curve-getparamatpoint d e) dsparam))
    (setq dsparam (vl-sort dsparam '>))
    (setq n (length (member (vlax-curve-getparamatpoint d e) dsparam)))
    (vlax-invoke-method d 'addfitpoint (- n 1) (vlax-3d-point e))
    )))
    (t nil)
    );cond
    )

    dùng cho polyline, 3dpolyline, spline


  5. có lẽ có thể tìm được câu trả lời trong lisp này

    Tiện có ai có thể xem giúp mình cái lisp đó nó tạo các mặt 3dface kiểu gì không, vì mình đọc mãi mà không hiểu chỗ cái lệnh "TIN" ấy, nó lấy ra tập hợp "l" toàn điểm lung tung, rồi đùng 1 cái nó nhảy ra tập hợp "l2" chứa các tập hợp 3 điểm gần nhau rồi vẽ ra các mặt 3dface. thật kỳ diệu.

    Noi suy 3Dface_Hoan thien.LSP


  6. mình làm đại khái cho bạn hiểu nhé

    (setq 3d (vlax-ename->vla-object (car (entsel))))

    (setq danhsach (vlax-get 3d 'Coordinates))

     

    nó sẽ trả về danh sách tọa độ các điểm 3d theo kiểu (x1 y1 z1 x2 y2 z2 ...)

    dùng hàm (group-by-num danhsach 3) sau để lấy danh sách tọa độ kiểu ((x1 y1 z1) (x2 y2 z2)...)

    (defun group-by-num (lst num / ls ret)
    (if (= (rem (length lst) num ) 0)
    (progn (setq ls nil)
      (repeat (/ (length lst) num)
        (repeat num (setq ls(cons (car lst) ls)lst (cdr lst)))
      (setq ret (append ret (list (reverse ls))) ls nil)))) ret)

     

    • Like 1

  7. Vào lúc 21/10/2018 tại 10:04, gia_bach đã nói:

    Tham khảo lisp add vertex tại trung điểm của các segments :

    • 3dpseg-midvtx.lsp
      lisp help
    •  
    
    (defun c:3dpseg-midvtx ( / ss i e l p pl mpl pln )
      (if (setq ss (ssget "_:L" '((0 . "POLYLINE") ))))
        (repeat (setq i (sslength ss))
          (setq e (ssname ss (setq i (1- i))))
          (setq l (safearray-value (variant-value (vla-get-coordinates (vlax-ename->vla-object e)))))
          (repeat (/ (length l) 3)
            (setq p (list (car l) (cadr l) (caddr l)))
            (setq pl (cons p pl))
            (setq l (cdddr l))      )
          
          (setq pl (reverse pl))
          (if (vlax-curve-isclosed e)
            (setq pl (reverse (cons (car pl) (reverse pl))))      )
          
          (setq mpl (mapcar '(lambda ( a b ) (mapcar '(lambda ( c d ) (/ (+ c d) 2.0)) a b)) pl (cdr pl)))
          (setq pln (apply 'append (mapcar '(lambda ( a b ) (list a b)) pl mpl)))
          (if (not (vlax-curve-isclosed e))
            (setq pln (reverse (cons (last pl) (reverse pln))))      )
          
          (repeat (length mpl)
            (vla-appendvertex (vlax-ename->vla-object e) (vlax-3d-point (last pl)))      )
          
          (vlax-put (vlax-ename->vla-object e) 'coordinates (apply 'append pln))
          (setq pl nil pln nil)    )  )
      (princ))

     

    em đã hiểu. cảm ơn nhiều ạ


  8. Vào lúc 16/9/2009 tại 12:44, gia_bach đã nói:

    nataca đọc không kỹ rồi.

    Vấn đề đang nói là hàm Addvertex, mà hàm này chỉ dùng đuợc với đối tuợng LWPOLYLINE (Lightweight Polyline) hay 2Dpolyline.

    Để thêm đỉnh vào đối tuợng 3Dpolyline phải dùng hàm khác.

     

    (Thực tế khi xem các mã DXF của LWPOLYLINE, thông tin các đỉnh cũng đuợc lưu với kiểu 2D, thông tin cao độ Z (Elevation) đuợc lưu với mã DXF 38)

    Tui đang nói về đối tuợng LWPOLYLINE còn bạn nói về đối tuợng 3Dpolyline.

    đuơng nhiên DXF hay tọa độ của 2 kiểu đối tuợng này phải khác nhau.

    Bác ơi cái hàm vlax-invoke 'addvertex thì em hiểu rõ rồi. Nhưng em đang tìm hàm nào thêm đỉnh cho đường 3dpoly. Theo tìm hiểu thì nó k phải là addvertex mà là appendvertex thì phải. Nhưng k biết cấu trúc của nó ntn. Em thử (vlax-invoke-method obj 'appendvertex (vlax-3d-point pt)) rồi mà nó chỉ thêm đỉnh vào cuối đường 3p thôi

×