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

cuongtk2

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

    899
  • Đã tham gia

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

  • Ngày trúng

    146

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


  1. Một đoạn code đã được edit sau khi nhờ chat GPT

    (defun c:Test ( / textEnt textVal plineEnt layerName textHeight dist pllength pt i) 
      (setq layerName "Caodo_Pline")  
      (setq textEnt (car (entsel "\nChon Text có san là cao do: ")))
      (if (and textEnt (= (cdr (assoc 0 (entget textEnt))) "TEXT"))
        (setq textVal (cdr (assoc 1 (entget textEnt)))) ;; L?y giá tr? n?i dung
        (progn
          (princ "\nKhông phai doi tuong TEXT. Thoát lenh.")
          (exit)
        )
      )  
      (setq plineEnt (vlax-ename->vla-object (car (entsel "\nChon Polyline can gán cao do: "))))  
    
      (setq textHeight 0.2)
    
      
      (setq dist (getreal "\nNhap khoang cách chia deu [Mac dinh 1.5]: "))
      (if (not dist) (setq dist 1.5)) 
    
      
      (setq pllength (vlax-curve-getDistAtParam plineEnt (vlax-curve-getEndParam plineEnt)))
    
     
      (setq i 0)
      (while (< (* i dist) pllength)
        (setq pt (vlax-curve-getPointAtDist plineEnt (* i dist)))
        (entmake
          (list '(0 . "TEXT")
                (cons 8 layerName)    ;; Ð?t vào Layer Caodo_Pline
                (cons 1 textVal)      ;; N?i dung Text
                (cons 40 textHeight)  ;; Chi?u cao ch?
                (cons 10 pt)          ;; Ði?m chèn
                (cons 50 0)           ;; Góc xoay
          )
        )
        (setq i (1+ i)) ;; Tang ch? s? l?p
      )
    
      (princ "\nHoàn thành gán Text cao do.")
    )

     

    • Vote tăng 1

  2. Thông thường người ta sử dụng lại hàm lisp trong c# khi không muốn viết lại một hàm nào đó bằng cách invoke.  Hầu hết sử dụng ở cuối của chương trình, để sau đó là không có sau đó. Tức là dạng đi nhờ xe, không để lại kết quả để phục vụ cho công tác khác. Vì tốc độ của lisp chậm, chỉ trừ trong trường hợp đặc biệt mới sử dụng, còn bình thường code mô phỏng lại lisp. 

    • Like 1

  3. 8 giờ trước, minhtuan57hk đã nói:

    Hi anh. Anh ơi em tìm được trên mạng đoạn code ntn. Nhờ anh build giúp để sử dụng được trong CAD được không ạ.

    https://www.keanw.com/2010/06/tracing-a-boundary-defined-by-autocad-geometry-using-net.html

    Em cảm ơn anh!

    Mục tiêu của em để làm gì, bởi đã có lệnh BO trong Cad để tạo Boundary rồi.

    Code của Kean chỉ mang ý nghĩa học thuật, hầu hết phục vụ cho coder về mặt hướng dẫn chứ không phải cho người vẽ.

    • Vote tăng 1

  4. Thay vì phải chọn  phía đầu mút dư ngắn như vậy mình sẽ chọn phương án kéo điểm gần biên chặn hơn về đến biên chặn. Như vậy sẽ có chức năng Trim  và Extend cùng lúc.

    Lệnh mới chỉ dùng được cho LINE và LWPOLYLINE.

    Chọn các đường cần cắt, sau đó chọn biên cắt.

     

    (DEFUN c:test  ( / BIEN EP LS PARAM PT SP fillcoord)
      (DEFUN fillcoord  (pt)
      (VLAX-MAKE-VARIANT
        (VLAX-SAFEARRAY-FILL
          (VLAX-MAKE-SAFEARRAY VLAX-VBDOUBLE '(0 . 1))
          (LIST (CAR pt) (CADR pt))
          )
        )
      )
      (PROMPT "\nChon cac LINE, PLINE bi cat")
      (SETQ ls (MAPCAR 'VLAX-ENAME->VLA-OBJECT (ACET-SS-TO-LIST (SSGET '((0 . "LINE,LWPOLYLINE"))))))
      (SETQ bien (VLAX-ENAME->VLA-OBJECT (CAR (ENTSEL "\nChon bien chan:"))))
    
      (foreach obj ls
      (SETQ pt (VLAX-SAFEARRAY->LIST (VLAX-VARIANT-VALUE (VLA-INTERSECTWITH obj bien ACEXTENDTHISENTITY))))
    
      (SETQ sp    (VLAX-CURVE-GETPOINTATDIST obj 0)
            ep    (VLAX-CURVE-GETPOINTATDIST obj (VLA-GET-LENGTH obj))
            param (VLAX-CURVE-GETPARAMATDIST obj (VLA-GET-LENGTH obj))
            )
      (IF (= (VLA-GET-OBJECTNAME obj) "AcDbPolyline")
        (IF (< (DISTANCE pt sp) (DISTANCE pt ep))
          (VLA-PUT-COORDINATE obj 0 (fillcoord pt))
          (VLA-PUT-COORDINATE obj param (fillcoord pt))
          )
        )
      (IF (= (VLA-GET-OBJECTNAME obj) "AcDbLine")
        (IF (< (DISTANCE pt sp) (DISTANCE pt ep))
          (VLA-PUT-STARTPOINT obj (vlax-3d-point pt))
          (VLA-PUT-ENDPOINT obj (vlax-3d-point pt))
          )
        )
        )
      )

     


  5. (defun c:exptxt( / F FN LST ND P TT X Y)
     (setq lst	(ACET-SS-TO-LIST  (ssget '((0 . "*TEXT"))))
    fn  (getfiled "Ten file: " "" "txt" 1)
    f   (open fn "w")
     )
     (foreach e lst
       (setq tt (entget e)
      p  (cdr (assoc 10 tt))
      x  (rtos (car p) 2 3)
      y  (rtos (cadr p) 2 3)
      nd  (VL-STRING-TRANSLATE "," "." (cdr (assoc 1 tt)))
       )
       (write-line (strcat x "\t" y "\t" nd ) f)
     )
     (close f)
     (princ)
    )

    Chỉnh sửa chút cho nó dùng cùng loại dấu ".". Các toạ độ XY dùng 3 chữ số sau thập phân.

    Nó vẫn còn mà.


  6. Tính chiều dài công dồn pline.

    (defun c:test ( / ANG obj D ENT EP I LS LS1 MSPACE MYOBJ N PTLIST SP TMP)
    (setq ent (car (entsel)))
    (setq ls (ACET-GEOM-PLINE-POINT-LIST ent t))
    (setq sp (car ls)
          ep (cadr ls)
          obj (vlax-ename->vla-object ent)
          ang (if (< (angle sp ep) (* pi 0.5)) 0 pi)
          n (length ls) i 1
          ls1 (list sp)
          )
    (while ( < i n)
      (setq ls1 (append ls1 (list (polar sp ang (vlax-curve-getDistAtParam obj i))))
            )
    (setq i (1+ i))
      )                    
     (setq mspace (vla-get-modelspace (vla-get-activedocument 
                  (vlax-get-acad-object))))
      (setq  ptlist (apply 'append ls1)) 
      (setq  tmp (vlax-make-safearray  vlax-vbDouble (cons 0 (- (length ptlist) 1))))
      (vlax-safearray-fill tmp ptlist)
          (setq myobj (vla-addPolyline mspace tmp))
      )
    
    

     


  7. Câu hỏi của bạn trúc trắc làm người không cùng chuyên môn khó nắm bắt được vấn đề. Với tôi cảm nhận được như bạn muốn chiếu đường gấp khúc đó xuống trục X thành các đoạn thẳng nối tiếp. Hoặc có thể là quay các đoạn nghiêng song song trục X để tổng chiều dài pline không đổi.

×