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

ngokiet

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

    404
  • Đã tham gia

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

  • Ngày trúng

    43

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


  1. 1 giờ trước, Doan Nguyen Van đã nói:

    Bước này bác thực hiện trên field hay ở đâu vậy

    E thử field lẫn vla đều không có 

    (defun c:tt(/ en1 p0)
      (if (and (setq en1 (car (entsel "Chon text:")))
    	   (setq p0 (getpoint "chon diem text:")))
        (entmakex (list '(0 . "TEXT") '(100 . "AcDbText") '(40 . 2.0)
    		   (cons 10 p0) (cons 1 (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa(vla-get-objectid (vlax-ename->vla-object en1))) ">%).Text>%")))))
      (princ))

    Thử code trên. Xong regen lại.

    Vla-put-TextString vẫn được nhe.

    • Like 1

  2. Vào lúc 26/3/2020 tại 08:54, Doan Nguyen Van đã nói:

    1375004227_ezgif.com-video-to-gif(2).gif.6cd1073f87c07659acd244818ae7e8b7.gif

    Thử xem oke không bạn.

    
    (defun c:te (/ ss pt l1 l2 pt2)
      (setq ss (ssget (list (cons 0 "LWPOLYLINE,LINE"))))
      (setq pt (getpoint "\nPick point"))
      (setq l1 (acet-ss-zoom-extents ss))
      (setq l2 (acet-ss-zoom-extents (ssget "_X")))
      (command "Move" ss "" "_NON" (car l1) "_NON" (cadr l2))
      (setq pt2 (polar pt (angle (car l1) (cadr l2)) (distance (car l1) (cadr l2))))
      (acet-ss-zoom-extents ss)
      (command "BOUNDARY" pt2 "" )
      (setq ss (ssadd (entlast) ss))
      (command "Move" ss "" "_NON" (cadr l2) "_NON" (car l1))
      (acet-ss-zoom-extents ss)
      )

     

    Phức tạp nhỉ.

    Lệnh boundary có thể làm nhiếu hơn bạn nghĩ mà.

    Thử

    (defun c:bo1(/ ss)
      (setq ss (ssget))
      (command "_.Boundary" "A" "B" "N" ss "" ""))

    • Like 1
    • Vote tăng 1

  3. Xử lý format mtext của Cad rất khó chịu.

    Theo cách của @Doan Nguyen Van Thì khi nếu text có format width factor chỉ 1 đoạn trong text thì nó chỉ ảnh hưởng đoạn đó thôi.

    Muốn xử lý triệt để cho các trường hợp thì không dược.

    Nếu an toàn  thì dùng unformat cùa LeeMac rồi format lại. Hay nghiên cứu kỹ về format mtext thôi.

    Có thể  nghiên cứu kỹ hơn ỡ đây

    • Vote tăng 1

  4. 2 giờ trước, huunhantvxdts đã nói:

    Tìm được cái này 

    DXF code 70 = 0 -> pline open
    DXF code 70 = 1 -> pline closed
    DXF code 70 = 128 -> pline open, with Ltype gen actived
    DXF code 70 = 129 -> pline closed, with Ltype gen actived

     

    Các bạn cho hỏi gán lại biến gì để khi tạo mới 1 đường POLYLINE thì mã DFX 70 của nó về 0 hoặc 1

    Thử (setvar ‘plinegen 0) 

    Nó ảnh hưởng linetype của pline.

    Bạn muốn check pline  open close thì dùng lệnh

    (eq (boole 6 (cdr (assoc 70 (entget ent))) 1) 1) thì hay hơn.

    • Like 1

  5. Cái này không phải là lỗi. APPERTURE Là định khoảng cách bắt osnap của cad. Khoảng cách bắt điểm mặc định là 10 pixel. Đặt càng lớn nó bắt điểm càng xa. 
    Các máy sau này độ phân giải cao nên cần set lại cho phù hợp. Tuỳ theo độ phân giải màn hình mà set chứ không nhất định là 50. Đặt lớn quá thì khi hình phức tạp nó tính càng lâu vì có nhiều điểm trong phạm vi chuột. 

    • Like 2
    • Vote tăng 1

  6. 6 giờ trước, Nguyen Hoang Thuy Linh đã nói:

    Bác ngokiet đúng ý em quá rồi, em thử good lắm a, bác fix +0.5 đúng là cái em mắc phải mà em không nghỉ tới, vì file của em Import từ cái file đuôi .igs nên thỉnh thoảng nó củng ra số gần đúng. nếu fix + - 0.5 thì ok hơn, bác chỉ e sửa thêm -0.5 nửa nhé!!!

    Mình viết fix +0.5 là làm tròn số. ví dụ như 74.5 -> 75.49 thì nó thành 75. Chứ fix ko thì 74.999 nó chỉ ra 74 thôi.

    Nếu sai số nhiều hơn thì dùng cái này

    (defun c:ddk ( / ndc  ent)
      (setq ent (entlast))
      (command "DIMDIAMETER")
      (while (< 0 (getvar "CMDACTIVE")) (command pause))
      (if (/= ent (setq ent (entlast)))
        (Progn
          (setq ndc (cdr(assoc 42 (entget ent))))
          (if (vl-some '(lambda(x)
    		      (if (equal ndc (car x) 0.999) (setq ndc (cdr x))))
    		   '((75  . "5K-10A")  (80 . "5K-15A")   (85 . "5K-20A")
    		     (95  . "5K-25A")  (115 . "5K-32A")  (120 . "5K-40A")
    		     (130 . "5K-50A")  (155 . "5K-65A")  (180 . "5K-80A")
    		     (190 . "5K-900A") (200 . "5K-100A") (235 . "5K-125A")
    		     (265 . "5K-150A") (300 . "5K-175A") (320 . "5K-200A")
    		     (345 . "5K-225A") (385 . "5K-250A") (430 . "5K-300A")
    		     (480 . "5K-350A")))
    	(entmod (list (cons -1 ent) (cons 1 ndc))))))
      (princ))

    @NTHAHT Dùng vl-remove thì nó so sánh toàn bộ. Mình dùng vl-some thì khi có kết quả thì nó ngừng.

     

    Còn bác muốn tự động vào layer thì cứ tạo layer rồi sử dụng dimlayer là được. Không cần chèn vào lisp cho rối. 

    • Vote tăng 1

  7. 2 giờ trước, NTHAHT đã nói:

    - Dữ liệu bạn đầu toàn số nguyên mà! Thêm chút nữa: (or (eq (fix ndc) 120) (eq (itoa (rtos ndc 2 0)) 120))

    - Còn muốn chấp nhận sai số trong 1 khoảng nào đó (vd: 0.999) thì theo như @ngokiet: (equal ndc 120 0.999).

     

    Hic mình nhắc đổi thành equal thì phải thêm sài số vào.

     

    Mình viết sơ lại

    (defun c:ddk ( / ndc  ent)
      (setq ent (entlast))
      (command "DIMDIAMETER")
      (while (< 0 (getvar "CMDACTIVE")) (command pause))
      (if (/= ent (setq ent (entlast)))
        (if (setq ndc (assoc (fix (+ 0.5 (cdr(assoc 42 (entget ent)))))
    			 '((75 . "5K-10A")
    			   (80 . "5K-15A")
    			   (85 . "5K-20A")
    			   (95 . "5K-25A")
    			   (115 . "5K-32A")
    			   (120 . "5K-40A")
    			   (130 . "5K-50A")
    			   (155 . "5K-65A")
    			   (180 . "5K-80A")
    			   (190 . "5K-900A")
    			   (200 . "5K-100A")
    			   (235 . "5K-125A")
    			   (265 . "5K-150A")
    			   (300 . "5K-175A")
    			   (320 . "5K-200A")
    			   (345 . "5K-225A")
    			   (385 . "5K-250A")
    			   (430 . "5K-300A")
    			   (480 . "5K-350A"))))
          (entmod (list (cons -1 ent) (cons 1 (cdr ndc))))))
      (princ))

     


  8. 23 phút trước, duy782006 đã nói:
    
    (defun c:ddk ( / ndc  dtdtt)
    (command "DIMDIAMETER")
    (while (< 0 (getvar "CMDACTIVE"))
    (command pause)
    ) 
    (setq ndc (cdr (assoc 1  (entget (entlast)))))
    (cond 
    ((= ndc "") (setq ndc (cdr (assoc 42  (entget (entlast))))))
    )
    (cond  ((= ndc 75) (setq ndc "5K-10A")) )
    (cond  ((= ndc 80) (setq ndc "5K-15A")) )
    (cond  ((= ndc 85) (setq ndc "5K-20A")) )
    (cond  ((= ndc 95) (setq ndc "5K-25A")) )
    (cond  ((= ndc 115) (setq ndc "5K-32A")) )
    (cond  ((= ndc 120) (setq ndc "5K-40A")) )
    
    (setq dtdtt (subst (cons 1 ndc) (assoc 1 (entget (entlast))) (entget (entlast))))
    (entmod dtdtt)
    
    (princ)
    )

    Viết thử mà hông biết sao nó lại chạy chập chờn lúc được lúc không. Mới nhập từ 75 đến 120 thôi. Ỗn định thì bạn tự nhập tiếp.

    Lúc được lúc không là do dim có giá trị gần đúng. Thay = bằng equal là được.

    Lisp bạn viết hơi rối.

     

    • Vote tăng 1

  9. 54 phút trước, Doan Van Ha đã nói:

    Nếu điểm đầu (A) và điểm cuối (B) khác nhau thì:

    - Nếu AB vuông góc trục X: bài toán vô nghiệm.

    - Còn lại: bài toán luôn có 2 nghiệm.

    Cách xác định cũng dễ thôi.

     

    Vẽ Arc.dwg

    Vẽ Arc.png

    Chỉ có nghiệm màu vàng là đúng thôi. Vấn đề là xét làm sao đúng startangle/endangle.

    Muốn xác định đúng hướng thì do Arc luôn ngược chiều kim đồng hồ nên xét góc giữa Direction và Góc AB để kiểm tra hướng.

     

    Nếu viết lisp thì cứ sài command luôn cho dễ.


  10. 5 giờ trước, Danh Cong đã nói:

    @ngokiet

     : Bạn có thể tham khảo code tôi viết sắp xếp Text :   :))

     

    
    
    
    
    	(defun c:SXT ( / #HUONG_XEP_TEXT #TEXT_ALIGHT DXF DXF10_Y DXF11_X DXF11_Y OBJECT PT DXF10_ DXF10_X OBJECT-SELECT)
    	  (setq #HUONG_XEP_TEXT "Ver")
    	  (initget "Ver Hor")
    	  (setq #HUONG_XEP_TEXT (cond ((getkword (strcat "\nText Align : [Ver/Hor] <" #HUONG_XEP_TEXT ">"))) (#HUONG_XEP_TEXT)))
    
    
    
    	  (setq #TEXT_ALIGHT "L")
    	  (initget "L C R A M F TL TC TR ML MC MR BL BC BR")
    	  (setq #TEXT_ALIGHT (cond ((getkword (strcat "\nJustify Text : [L/C/R/A/M/F/TL/TC/TR/ML/MC/MR/BL/BC/BR] <" #TEXT_ALIGHT ">"))) (#TEXT_ALIGHT)))
    	  
    	  (setq object (acet-ss-to-list (ssget '((0 . "*TEXT"))))
    	    object-select (ACET-LIST-TO-SS object)
    	    pt (getpoint "\nPick Point"))
    
    
    
    	  (cond ((= #TEXT_ALIGHT "L") (command "JUSTIFYTEXT" object-select ""  "Left"))
    	    ((= #TEXT_ALIGHT "C") (command "JUSTIFYTEXT" object-select ""  "Center"))
    	    ((= #TEXT_ALIGHT "R") (command "JUSTIFYTEXT" object-select ""  "Right"))
    	    ((= #TEXT_ALIGHT "A") (command "JUSTIFYTEXT" object-select ""  "Aligned"))
    	    ((= #TEXT_ALIGHT "M") (command "JUSTIFYTEXT" object-select ""  "Middle"))
    	    ((= #TEXT_ALIGHT "F") (command "JUSTIFYTEXT" object-select ""  "Fit"))
    	    ((= #TEXT_ALIGHT "TL") (command "JUSTIFYTEXT" object-select "" "TL"))
    	    ((= #TEXT_ALIGHT "TC") (command "JUSTIFYTEXT" object-select "" "TC"))
    	    ((= #TEXT_ALIGHT "TR") (command "JUSTIFYTEXT" object-select "" "TR"))
    	    ((= #TEXT_ALIGHT "ML") (command "JUSTIFYTEXT" object-select "" "ML"))
    	    ((= #TEXT_ALIGHT "MC") (command "JUSTIFYTEXT" object-select "" "MC"))
    	    ((= #TEXT_ALIGHT "MR") (command "JUSTIFYTEXT" object-select "" "MR"))
    	    ((= #TEXT_ALIGHT "BL") (command "JUSTIFYTEXT" object-select "" "BL"))
    	    ((= #TEXT_ALIGHT "BC") (command "JUSTIFYTEXT" object-select "" "BC"))
    	    ((= #TEXT_ALIGHT "BR") (command "JUSTIFYTEXT" object-select "" "BR"))
    	    )
    	    
    	  (cond ((and (= #HUONG_XEP_TEXT "Ver") (= #TEXT_ALIGHT "L"))
    	       (foreach ss object
    	            (progn
    	            (setq dxf (entget ss)
    	              dxf10_y (caddr (assoc 10 dxf)))
    	            (setq dxf (subst (cons 10 (list (car pt) dxf10_y )) (assoc 10 dxf) dxf))
    	            (entmod dxf)
    	            ); end progn
    	            ); end foreach
    	     )
    	    ((= #HUONG_XEP_TEXT "Ver")
    	       (foreach ss object
    	            (progn
    	            (setq dxf (entget ss)
    	              dxf11_y (caddr (assoc 11 dxf)))
    	            (setq dxf (subst (cons 11 (list (car pt) dxf11_y )) (assoc 11 dxf) dxf))
    	            (entmod dxf)
    	            ); end progn
    	            ); end foreach
    	     )
    
    
    
    	      ((and (= #HUONG_XEP_TEXT "Hor")(= #TEXT_ALIGHT "L"))
    	       (foreach ss object
    	            (progn
    	            (setq dxf (entget ss)
    	              dxf10_x (cadr (assoc 10 dxf)))
    	            (setq dxf (subst (cons 10 (list dxf10_x (cadr pt) )) (assoc 10 dxf) dxf))
    	            (entmod dxf)
    	            ); end progn
    	            ); end foreach
    	     )
    	    ((= #HUONG_XEP_TEXT "Hor")
    	       (foreach ss object
    	            (progn
    	            (setq dxf (entget ss)
    	              dxf11_x (cadr (assoc 11 dxf)))
    	            (setq dxf (subst (cons 11 (list dxf11_x (cadr pt) )) (assoc 11 dxf) dxf))
    	            (entmod dxf)
    	            ); end progn
    	            ); end foreach
    	     )
    	    ); end cond
    	  (princ))
    	 
    

    Bác viết bình thường theo sài command justifytext chứ đâu phải entmod- Trong lệnh cond của bác để xét #TEXT_ ALI GH T  thì bác có thể dùng

    (command "JUSTIFYTEXT" object-select ""  #TEXT_ ALI GH T) )cho nó gọn và tránh phài so sánh nhiều lần.-

    Về lệnh entmod Thì ngoài giá trị đầu chỉ ent cần sửa thì các giá trị sau cần sủa giá trị dxf nào thì sửa cái đó thôi.Ví dụ như lisp bas mình sửa lại như sau

    ;; free lisp from cadviet.com
    ;;; this lisp was downloaded from https://www.cadviet.com/forum/topic/14210-h%E1%BB%8Fi-v%E1%BB%81-lisp-thu%E1%BA%ADt-to%C3%A1n-%C3%BD-t%C6%B0%E1%BB%9Fng-coding/?page=130
    (defun c:SXT ( / #HUONG_XEP_TEXT #TEXT_ALIGHT DXF DXF10_Y DXF11_X DXF11_Y OBJECT PT DXF10_ DXF10_X OBJECT-SELECT n)
    	  (setq #HUONG_XEP_TEXT "Ver")
    	  (initget "Ver Hor")
    	  (setq #HUONG_XEP_TEXT (cond ((getkword (strcat "\nText Align : [Ver/Hor] <" #HUONG_XEP_TEXT ">"))) (#HUONG_XEP_TEXT)))
    
    
    
    	  (setq #TEXT_ALIGHT "L")
    	  (initget "L C R A M F TL TC TR ML MC MR BL BC BR")
    	  (setq #TEXT_ALIGHT (cond ((getkword (strcat "\nJustify Text : [L/C/R/A/M/F/TL/TC/TR/ML/MC/MR/BL/BC/BR] <" #TEXT_ALIGHT ">"))) (#TEXT_ALIGHT)))
    	  
    	  (setq object (acet-ss-to-list (ssget '((0 . "*TEXT"))))
    	    object-select (ACET-LIST-TO-SS object)
    	    pt (getpoint "\nPick Point"))
    
    
    	  (command "JUSTIFYTEXT" object-select ""  #TEXT_ALIGHT)
    	  
    	  
    	  (setq n (if (= #TEXT_ALIGHT "L") 10 11))
    
    	  
    	  (if (= #HUONG_XEP_TEXT "Ver")
    	      (foreach ss object
    	            (setq dxf (entget ss)
    	              dxf10_y (caddr (assoc n dxf)))
    		    (entmod (list (car dxf) (list n (car pt) dxf10_y)))   
    	            )
    	      (foreach ss object
    	            (setq dxf (entget ss)
    	              dxf10_x (cadr (assoc n dxf)))
    		    (entmod (list (car dxf) (list n dxf10_y (cadr pt))))   
    	            )
    	    );end if
    	  (princ))


          Mình không thích sài command trong lisp cho lắm. Nếu mình viết thường sửa thẳng 1 lần trong entmod luôn.

    Mình chỉ sửa lisp của bạn để chạy giống y lisp cũ thôi.

    Chứ lisp đó khi xắp xép text khi gặp mtext thì có thể lỗi vì dxf mtext khác text.

    Với trường hợp justify là fit, align thì text có thể bị kéo giãn hay thay đỗi chiếu cao. 2 trường hợp này phải thay đổi cả dxf 10 và 11.

    • Vote tăng 1

  11. 12 giờ trước, anhGeodesy đã nói:

    Bác @ngokiet @Danh Cong Hình như hàm entmod vẫn khó áp dụng cho bài toán đổi Justify của text.

    em viết thế này mong các bác thông não thêm.

    
    (defun TD:JustifyType (ent / dxf71 dxf72 X11)
      (setq dxf10 (cdr (assoc 10 (entget ent))))
      (setq dxf11 (cdr (assoc 11 (entget ent))))
      (setq X11 (car dxf11))
      (setq dxf71 (cdr (assoc 71 (entget ent))))
      (setq dxf72 (cdr (assoc 72 (entget ent))))
      (if (or (and (eq dxf71 0) (eq dxf72 0) (eq X11 0))
          (and (eq dxf71 0) (eq dxf72 3))
          (and (eq dxf71 0) (eq dxf72 5))
          )
    ;;;    dxf10
    ;;    dxf11
        (setq dxf "Dxf10")
        (setq dxf "Dxf11")
      )
    )
    (defun TD:Text-Base (ent / dxf71 dxf72 X11)
      (setq dxf10 (cdr (assoc 10 (entget ent))))
      (setq dxf11 (cdr (assoc 11 (entget ent))))
      (setq X11 (car dxf11))
      (setq dxf71 (cdr (assoc 71 (entget ent))))
      (setq dxf72 (cdr (assoc 72 (entget ent))))
      (if (or (and (eq dxf71 0) (eq dxf72 0) (eq X11 0))
          (and (eq dxf71 0) (eq dxf72 3))
          (and (eq dxf71 0) (eq dxf72 5))
          )
        dxf10
        dxf11
    ;;;    (setq dxf "Dxf10")
    ;;    (setq dxf "Dxf11")
      )
    )
    ;-----------------------------------------------
    (defun c:jt (/ Justify e1 Lst dxf10 dxf11)
    (setq    e1
         (car
           (LM:SelectIf
             "\nCh\U+1ECDn Text c\U+1EA7n \U+0111\U+1ED5i Justify: "
             (lambda (x)
               (eq "TEXT"
               (cdr (assoc 0 (entget (car x))))
               )
             )
             entsel
             nil
           )
         )
      )
      (setq Pnt (TD:Text-Base e1))
      (setq dxf (TD:JustifyType e1))
      (setq Lst (entget e1))
      (setq Justify (AT:Justify))
      (princ Justify)
    ;----------------------------------------------------------------
    ;Dua dang khac ve dang: Left / Fit / Aligned (3 thang nay su dung: dxf10)
      (if (and (eq Justify "Left")) ;ok
          (Progn
        (setq txt_h (cdr (assoc 40 Lst)))
        (setq txt_val (cdr (assoc 1 Lst)))
        (command "text" "L" Pnt txt_h 0 txt_val)
        (command "erase" e1 "")
          )
        )
    (if (and (eq Justify "Center")) ;ok
          (Progn
        (setq txt_h (cdr (assoc 40 Lst)))
        (setq txt_val (cdr (assoc 1 Lst)))
        (command "text" "C" Pnt txt_h 0 txt_val)
        (command "erase" e1 "")
          )
        )
    (if (and (eq Justify "Right")) ;ok
          (Progn
        (setq txt_h (cdr (assoc 40 Lst)))
        (setq txt_val (cdr (assoc 1 Lst)))
        (command "text" "R" Pnt txt_h 0 txt_val)
        (command "erase" e1 "")
          )
        )
    (if (and (eq Justify "TOPLeft")) ;ok
          (Progn
        (setq txt_h (cdr (assoc 40 Lst)))
        (setq txt_val (cdr (assoc 1 Lst)))
        (command "text" "TL" Pnt txt_h 0 txt_val)
        (command "erase" e1 "")
          )
        )
      (if (and (eq Justify "TOPCenter")) ;ok
          (Progn
        (setq txt_h (cdr (assoc 40 Lst)))
        (setq txt_val (cdr (assoc 1 Lst)))
        (command "text" "TC" Pnt txt_h 0 txt_val)
        (command "erase" e1 "")
          )
        )
      (if (and (eq Justify "TOPRight")) ;ok
          (Progn
        (setq txt_h (cdr (assoc 40 Lst)))
        (setq txt_val (cdr (assoc 1 Lst)))
        (command "text" "TR" Pnt txt_h 0 txt_val)
        (command "erase" e1 "")
          )
        )
      (if (and (eq Justify "BOTTOMLeft")) ;ok
          (Progn
        (setq txt_h (cdr (assoc 40 Lst)))
        (setq txt_val (cdr (assoc 1 Lst)))
        (command "text" "BL" Pnt txt_h 0 txt_val)
        (command "erase" e1 "")
          )
        )
      (if (and (eq Justify "BOTTOMCenter")) ;ok
          (Progn
        (setq txt_h (cdr (assoc 40 Lst)))
        (setq txt_val (cdr (assoc 1 Lst)))
        (command "text" "BC" Pnt txt_h 0 txt_val)
        (command "erase" e1 "")
          )
        )
      (if (and (eq Justify "BOTTOMRight")) ;ok
          (Progn
        (setq txt_h (cdr (assoc 40 Lst)))
        (setq txt_val (cdr (assoc 1 Lst)))
        (command "text" "BR" Pnt txt_h 0 txt_val)
        (command "erase" e1 "")
          )
        )
      (princ)
    )
    ;[Left/Center/Right/Align/Middle/Fit/TL/TC/TR/ML/MC/MR/BL/BC/BR]
    ;----------------------------------------------------------------     
    (defun AT:Justify (/ *Justify* Justify)
      (initget
        2
        "Left Center Right TOPLeft TOPCenter TOPRight BOTTOMLeft BOTTOMCenter BOTTOMRight"
      )
      (or *Justify* (setq *Justify* "Left"))
      (setq    Justify
         (cond
           ((getkword
              (strcat
            "\nCh\U+1ECDn T\U+1EF7 l\U+1EC7 b\U+1EA3n v\U+1EBD: [Left / Center / Right  / TOPLeft / TOPCenter / TOPRight / BOTTOMLeft / BOTTOMCenter / BOTTOMRight ] ? <"
            *Justify*
            ">: "
              )
            )
           )
           (*Justify*)
         )
      )
      (if (not Justify)
        (setq Justify *Justify*)
        (setq *Justify* Justify)
      )
    )
    (defun LM:SelectIf (msg pred func keyw / sel)
      (setq pred (eval pred))
      (while
        (progn
          (setvar 'ERRNO 0)
          (if keyw
        (apply 'initget keyw)
          )
          (setq sel (func msg))
          (cond
        ((= 7 (getvar 'ERRNO))
         (princ
           "\nB\U+1EA1n ch\U+1ECDn sai r\U+1ED3i! H\U+00E3y ch\U+1ECDn l\U+1EA1i."
         )
        )
        ((eq 'STR (type sel))
         nil
        )
        ((vl-consp sel)
         (if (and pred (not (pred sel)))
           (princ "")
         )
        )
          )
        )
      )
      sel
    )

     

    Bác viết hơi rối. Nên mình cũng chỉ đọc sơ.

    - Vế hàm AT:Justify của bạn thì *Justify* là biến cục bộ nên nó sẽ không lưu biến cho cac lần sử dụng sau.

    - Dxf code của Justify là 72 vả 73. Tham khảo https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2017/ENU/AutoCAD-DXF/files/GUID-62E5383D-8A14-47B4-BFC4-35824CAE8363-htm.html

    - Bạn xem dxf code 10 và 11 thì khi dxf72=dxf73=0 thì textalignmentpoint là insertpoint. 

    - Khi entmod thì chủ yếu nó lấy theo align point nên cần set lại nó cho đúng yêu cầu mình.

     

    Nhưng có lệnh justifytext sao không sài mà viết cho mệt vậy.


  12. 6 giờ trước, anhGeodesy đã nói:

     

    Cảm ơn 2 Bác @ngokiet @Danh Cong  Đã hiểu thêm về hàm entmod. 

    Hình như bạn hiểu sai lệnh subst mà. :-)

    Còn bác @Danh Cong mình không hiểu vla-put-alignment thì trả về T/nil thì entmod cái gì?

     

    Còn entmod thì có chiêu khác vui hơn nữa là không cần subst

    thừ lệnh này

    (entmod (list (cons -1 (car(entsel))) '(72 . 4) '(73 . 0)))

    Nó sẽ chuyển text về Middle. Lưu ý Text gốc là left thì nó sẽ chạy về tọa độ '(0 0 0). Vì assoc 11 là '(11 0.0 0.0 0.0)

     

    • Vote tăng 1

  13. 8 giờ trước, anhGeodesy đã nói:

    Nhờ các Bác hỗ trợ,  em muốn đổi Justify từng Text. em dùng Entmod mà ko như mong muốn.

    
    (defun AT:Justify ( / Justify)
    (setq Justify (cond (Justify) ("Left")))
    (initget "Leff  Right TOPLeft TOPRight BOTTOMLeft BOTTOMCenter BOTTOMRight")
    (setq Justify (cond ((getkword (strcat "\Ch\U+1ECDn T\U+1EF7 l\U+1EC7 b\U+1EA3n v\U+1EBD: [Leff/Right/TOPLeft/TOPRight/BOTTOMLeft/BOTTOMCenter/BOTTOMRight]<" Justify ">"))) (Justify)))
     )
    (defun c:00 ( / e1 en)
    (setq e1 (car(entsel "Ch\U+1ECDn Text c\U+1EA7n \U+0111\U+1ED5i Justify: "))) 
    (setq en (entget e1))
    (setq Justify (AT:Justify))    ;(princ Justify)
          (if(eq Justify "Leff")(entmod (subst (list (cons 72  0)(cons 73  0)) (list (assoc 72 en)(assoc 73 en)) en)))
    ;;;      (if(eq Justify "Center")       (progn  (entmod (subst (cons 72  1) (assoc 72 en) en))
    ;;                                (entmod (subst (cons 73  0) (assoc 73 en) en)) ) )
          (if(eq Justify "Right")        (entmod (subst (list (cons 72  2)(cons 73  0)) (list(assoc 72 en)(assoc 72 en)) en)))
    ;;;      (if(eq Justify "Aligned")      (entmod (subst (list (cons 72  3)(cons 73  0)) (list (assoc 72 en)(assoc 73 en)) en)))                                       
    ;;      (if(eq Justify "Middle")       (entmod (subst (list (cons 72  4)(cons 73  0)) (list (assoc 72 en)(assoc 73 en)) en)))
    ;;      (if(eq Justify "Fit")          (entmod (subst (list (cons 72  5)(cons 73  0)) (list (assoc 72 en)(assoc 73 en)) en)))
         (if(eq Justify "TOPLeft")      (entmod (subst (list (cons 72  0)(cons 73  3)) (list (assoc 72 en)(assoc 73 en)) en)))
    ;;;      (if(eq Justify "TOPCenter")    (entmod (subst (list (cons 72  1)(cons 73  3)) (list (assoc 72 en)(assoc 73 en)) en)))
          (if(eq Justify "TOPRight")     (entmod (subst (list (cons 72  2)(cons 73  3)) (list (assoc 72 en)(assoc 73 en)) en)))
    ;;;      (if(eq Justify "MIDDLELeft")   (entmod (subst (list (cons 72  0)(cons 73  2)) (list (assoc 72 en)(assoc 73 en)) en)))
    ;;      (if(eq Justify "MIDDLECenter") (entmod (subst (list (cons 72  1)(cons 73  2)) (list (assoc 72 en)(assoc 73 en)) en)))
    ;;      (if(eq Justify "MIDDLERight")  (entmod (subst (list (cons 72  2)(cons 73  2)) (list (assoc 72 en)(assoc 73 en)) en)))
          (if(eq Justify "BOTTOMLeft")   (entmod (subst (list (cons 72  0)(cons 73  1)) (list (assoc 72 en)(assoc 73 en)) en)))
          (if(eq Justify "BOTTOMCenter") (entmod (subst (list (cons 72  1)(cons 73  1)) (list (assoc 72 en)(assoc 73 en)) en)))
          (if(eq Justify "BOTTOMRight")  (entmod (subst (list (cons 72  2)(cons 73  0)) (list (assoc 72 en)(assoc 73 en)) en)))
          )

     

    Bác xem lại lệnh subst. Nó thay đổi 1 lần 1 giá trị thôi

    (entmod (subst ‘(72 . 2) (assoc 72 én) (subst ‘(73 . 0) (assoc 73 én) én)))

     

    Tuy nhiên chỉnh sửa nó còn ảnh hưởng assoc 10, 11 nữa nếu không thì text nhảy lung tung nên phải xét nhiều trường hợp khó chịu.

     

    Bạn nên sài lệnh CAD có sẵn cho đơn giản JUSTIFYTEXT

     

     

    • Vote tăng 1

  14. Vậy bạn thử cài Net framework 4.7 đi. Đôi khi do máy mới chưa cập nhật. Vì cái này thuộc chuẩn form của windows.

    Cad bạn sài véion bao nhiêu vậy

    1 giờ} trướ}c, dinhle727 đã nói:

    Chào bạn ngokiet

    Mình đang dùng win10, lỗi này chỉ xảy khi mình thay máy tính mới, các máy khác vẫn thao tác được bình thường.

     


  15. 6 giờ trước, dinhle727 đã nói:

    Cảm ơn bạn Danh Cong, mình mới đổi máy tính nên mới không thể thao tác được.

    Máy của các bạn khác, và máy cũ của mình khi kích vào taskbar Text vẫn có thể xắp xếp theo thứ tự như Excel được.

    Mình cũng đã thử cài phiên bản khác của autocad nhưng cũng không giải quyết được vấn đề.

    Mình xem trên này

    https://forums.autodesk.com/t5/autocad-forum/sort-result-from-find-and-replace/m-p/8095134#M938452

    Chắc bạn sài Win7 hả?


  16. 4 giờ trước, Doan Nguyen Van đã nói:

    Đây nhé a:

    • cadvietlisp.lsp
      lisp help
    •  
    
    (defun tachlist (lst / lst1 z x y l1)
      (setq lst1 (list) z 0 )
      (while (setq l1 (car lst))
        (setq lst (cdr lst))
        (if (< (caddr l1) 2.0) (if (= z 0) (setq x (car l1) y (cadr l1) z (caddr l1)) (setq y (cadr l1) z (+ z (caddr l1))))
    		(if (= z 0) (Setq lst1 (append lst1 (list l1))) (if (< z 2) (Setq lst1 (append lst1 (list (list x (cadr l1) (+ z (caddr l1)) ))) z 0)
    								     (Setq lst1 (append lst1 (list (list x y z) l1)) z 0))) )
        )
      lst1
      )

     

    Bác còn 1 lỗi nhỏ là nếu (caddr(last l2)) <2 thì mất luôn giá trị cuối.

    • Like 1
×