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

scale theo trục x và y

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

Khổ với cái bác anpha3 này quá, nhớ tên lệnh là SC2 nghe bạn !! nhiều khi bác down file về , load bằng lệnh ap, sau đó đánh tên lệnh trật thì cũng như không!!

Lệnh SC2 sẽ hỏi mấy câu như sau bằng tiếng Việt không dấu:

 

Chon doi tuong de scale :

Diem goc:

Ty le scale phuong X:

Ty le scale phuong Y:

 

SC2 nghĩa là scale theo 2 phương XY khác nhau.

Còn nếu bạn quen dùng tên khác thì cứ vào file lsp sửa tên SC2 theo ý bạn, ok?

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ôi có lisp scale theo 2 phương nhưng vẫn giữ chiều cao và bề rộng text như cũ. Nhưng chưa làm được với Mtext.

Có điều là tôi không biết thuật toán biến hình dạng ma trận, nên lisp chỉ đúng với text nằm ngang hoặc thẳng đứng thôi, còn text nằm xiên thì chưa được. Bác nào giỏi toán (như bác DOAN VAN HA chẳng hạn, vì thấy có lần làm giải phương trình gì đó) biết thuật toán này thì post lên thì sửa lisp sẽ hoàn thiện hơn.

 

http://www.mediafire.com/download/tzujlca9slfwlcb/sc2.LSP

 

Lisp này không giữ giá trị cũ của dim text vì làm như vậy là fake dim rồi.

Có lẽ lưu lại chiều cao, with factor, obliqing của text sau đó khôi phục lại sau khi explode.

 

@anpha3: Bạn xem lại biến EXPLMODE, cho =1 rồi thử lại lisp xem sao

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

@ndtnv : Lưu cũng chẳng có ích gì vì sau khi explode, đối tượng sẽ mang tên (code -1) khác hoàn toàn, thậm chí sau khi scale chưa nổ nó cũng mang tên khác, chỉ có thể edit ngay khi nó còn trong block thôi.

 

@anpha3 : botay.com

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

Em thử làm rồi vẫn không được Bác Ạ..

Lisp tớ dùng đây :

(defun C:sc2(/ ss p tlx tly btp tenbl)

  (defun BlockText (v tlx tly  / blks name def)

    (setq blks (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))

   name (vla-get-effectivename (vlax-ename->vla-object v)))

 

    (if (not (vl-catch-all-error-p (setq def (vl-catch-all-apply 'vla-item (list blks name)))))

      (vlax-for obj def

(if (= "AcDbText" (vla-get-objectname obj))

   (progn 

     (cond ((zerop (vla-get-Rotation obj))

            (vla-put-Height obj (/ (vla-get-Height obj) tly 1.0))

     (vla-put-ScaleFactor obj (* tly (/ (vla-get-ScaleFactor obj) tlx 1.0))))

 

    ((equal (* 0.5 pi) (vla-get-Rotation obj) 0.001)

            (vla-put-Height obj (/ (vla-get-Height obj) tlx 1.0))

     (vla-put-ScaleFactor obj (* tlx (/ (vla-get-ScaleFactor obj) tly 1.0))))

       ))))

    )

    (vla-Regen (vla-get-activedocument (vlax-get-acad-object)) :vlax-true)

    (princ) 

  )

  ;;;

  (prompt "\nChon doi tuong de scale :")

  (setq ss  (ssget)

p   (getpoint "\nDiem goc:")

   tlx (getreal "\nTy le scale phuong X:")

tly (getreal "\nTy le scale phuong Y:"))

  (if (not btp) (setq btp -1))

  (while (tblsearch "block" (setq tenbl (strcat "btmp" (itoa (setq btp (1+ btp)))))))

  (command "-block" tenbl p ss "")

  (command "-insert" tenbl p tlx tly 0)

  (BlockText (entlast) tlx tly)

  (command "explode" (entlast))

  (princ)

)

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

@ndtnv : Lưu cũng chẳng có ích gì vì sau khi explode, đối tượng sẽ mang tên (code -1) khác hoàn toàn, thậm chí sau khi scale chưa nổ nó cũng mang tên khác, chỉ có thể edit ngay khi nó còn trong block thôi.

 

@anpha3 : botay.com

Sau khi explode, thứ tự đối tượng sẽ không đổi.

Tôi sửa tạm như sau:

( Chưa test nhiều để chắc chắn thứ tự trong (ssget "p") có thay đổi hay không.

An toàn hơn thì nên sort ss theo dxf 5 )

 

(defun C:sc2(/ ss p tlx tly btp tenbl data obj)
  (defun BlockText (v tlx tly  / blks name def i)
    (setq blks (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
      name (vla-get-effectivename (vlax-ename->vla-object v)) i 0)
 
    (if (not (vl-catch-all-error-p (setq def (vl-catch-all-apply 'vla-item (list blks name)))))
      (vlax-for obj def
    (if (= "AcDbText" (vla-get-objectname obj))
        (setq data (cons  (list (vla-get-Height obj)(vla-get-ScaleFactor obj)(vla-get-ObliqueAngle obj) i )data)))
        (setq i (1+ i))
  )))
  ;;;
  (prompt "\nChon doi tuong de scale :")
  (setq ss  (ssget)
    p   (getpoint "\nDiem goc:")
      tlx (getreal "\nTy le scale phuong X:")
    tly (getreal "\nTy le scale phuong Y:"))
  (if (not btp) (setq btp -1))
  (while (tblsearch "block" (setq tenbl (strcat "btmp" (itoa (setq btp (1+ btp)))))))
    (command ".undo" "be")
  (command "-block" tenbl p ss "")
  (command "-insert" tenbl p tlx tly 0)
  (BlockText (entlast) tlx tly)
  (command "explode" (entlast))
    (setq ss (ssget "p"))
    (foreach e data
        (setq obj(vlax-ename->vla-object (ssname ss (last e))))
        (vla-put-Height obj (car e))
        (vla-put-ScaleFactor obj (cadr e))
        (vla-put-ObliqueAngle obj (caddr e))
    )
    (command ".undo" "e")
  (princ)
)

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

Thứ tự trước và sau khi explode cũng khác nhau, dxf -1 và 5 đều khác, xem như cad đã xoá các vật thể trước trong kho dữ liệu và tạo ra vật thể hoàn toàn mới. Làm 1 "thí nghiệm" như sau, chọn khoảng 10 vật khác nhau tẽt pline,line, circle ... rồi chạy lisp sau:

 


(defun c:test()
  (setq ss (ssget)
i -1 data nil data1 nil data2 nil
p   (getpoint "\nDiem goc:"))
  
  (repeat (sslength ss)
    (setq obj (vlax-ename->vla-object (ssname ss (setq i (1+ i))))
 data (append data (list (list (vla-get-objectname obj) i )))))
  
  (if (not btp) (setq btp -1))
  (while (tblsearch "block" (setq tenbl (strcat "btmp" (itoa (setq btp (1+ btp)))))))
  
  (command ".undo" "be")
  (command "-block" tenbl p ss "")
  (command "-insert" tenbl p 1 1 0)
 
  (setq blks (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
        name (vla-get-effectivename (vlax-ename->vla-object (entlast))) i 0)
 
    (if (not (vl-catch-all-error-p (setq def (vl-catch-all-apply 'vla-item (list blks name)))))
      (vlax-for obj def
        (setq data1 (append data1 (list (list (vla-get-objectname obj) i)))
     i (1+ i))))
 
  (command "explode" (entlast))
  (setq ss (ssget "p"))
  (foreach e data
        (setq obj (vlax-ename->vla-object (ssname ss (last e)))
     data2 (append data2 (list (list (vla-get-objectname obj) (last e)))))       
  )
  
  (princ data) (princ data1) (princ data2) (princ)
)

 

Tôi thấy nếu thay (setq ss (ssget "p")) bằng (setq ss (ssget)) và  thì 2 cái list trước và sau sẽ giống nhau, nhưng như vậy hơi phiền vì phải bắt 2 lần. Như vậy thì có vẻ hơi "lẩm cẩm"!!  :blink:  :blink:

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

Chào Bác Tot77 Em sử dụng lisp của Bác rồi song không được và báo như sau:

Command:error: no function definition: VLAX-GET-ACAD-OBJECT.

Am không biết nguyên nhân là sao.Bác xem lại giùm em với nhé.

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

mình có hình chữ nhật kích thước a(mm)xb(mm). mình muốn scale thành hình chữ nhật kích thước a+2 (mm) x b+5 (mm)thì làm sao các bác. mình đang học cad

Cách của mình là tạo block rồi bấm Ctrl +1, vào properties để scale trong x và y., nhưng đó là scale tỷ lệ. mình muốn đưa kích thươc vào ấy

 

minh cung thac mac muon hoi, minh co 2 hinh giong con ech dang ngoi. mot file hinh lon va 1 file hinh nho. minh muon scale cho 2 hinh khop voi nhau. ai biet chi giup minh voi

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

a c giúp e 1 câu ạ: Nếu trong bản vẽ e đang có Block A toàn bản vẽ nếu e muốn đổi nó thành Block B tại một khu vực mà k đổi tên và ký hiệu của Block A ở các khu vực khác. AC có lệnh j k giúp e với

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

×