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

Đổi vị trí base point của block thế nào

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

Chưa gặp bao giờ, hôm nay gặp ko biết làm thế nào cả

Nhờ các bác chỉ cách đổi vị trí tâm của Block

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ưa gặp bao giờ, hôm nay gặp ko biết làm thế nào cả

Nhờ các bác chỉ cách đổi vị trí tâm của Block

Trước hết Bác phải nhớ tên cái block đó, Explode rồi Make Block, chọn lại tên Block đó, dùng Pick point để chọn vị trí tâm, Select objects, OK, Yes.

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
Trước hết Bác phải nhớ tên cái block đó, Explode rồi Make Block, chọn lại tên Block đó, dùng Pick point để chọn vị trí tâm, Select objects, OK, Yes.

 

 

Ôi trời. Mình có phải con gà đâu mà ko biết làm điều đó

Phiphi hãy chịu khó lên diễn đàn nhiều hơn nữa nhé.

Làm sao để đổi tâm của tất cả các Block cùng tê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
Chưa gặp bao giờ, hôm nay gặp ko biết làm thế nào cả

Nhờ các bác chỉ cách đổi vị trí tâm của Block

TH này mình cũng không để ý lắm, giải pháp tạm thời của mình là bedit rồi chèn điểm base point parameter (kết quả cũng tương tự như mình chèn pick point khi tạo block)

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 này mình cũng không để ý lắm, giải pháp tạm thời của mình là bedit rồi chèn điểm base point parameter (kết quả cũng tương tự như mình chèn pick point khi tạo block)

 

base point parameter? Em ko tin là có thể làm đc. Để mai lên công ty em thử xem sao

Thanks Bác

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
base point parameter? Em ko tin là có thể làm đc. Để mai lên công ty em thử xem sao

Thanks Bác

Bản thân điểm chèn của block chính là điểm có toạ độ (0 0 0) trong block. Vậy bạn chỉ cần vào block rồi move đối tượng đi một khoảng nào đó thì điểm chèn đối với block đó đã bị thay đổi đi còn gì.

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
Bản thân điểm chèn của block chính là điểm có toạ độ (0 0 0) trong block. Vậy bạn chỉ cần vào block rồi move đối tượng đi một khoảng nào đó thì điểm chèn đối với block đó đã bị thay đổi đi còn gì.

Mình cũng hay làm theo cách của bạn, đầu tiên vào bedit rồi vẽ một đoạn thẳng với gốc có toạ độ là (0,0) đó chính là điểm chèn của block, sau đó bạn có thể move cả block đến vị trí bạn muốn với điểm chèn block là gốc đường thẳng vừa vẽ.

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ưa gặp bao giờ, hôm nay gặp ko biết làm thế nào cả

Nhờ các bác chỉ cách đổi vị trí tâm của Block

Muốn thay đổi vị trí của tất cả các block trong bản vẽ mà ko làm thay đổi điểm chèn của block (yêu cầu quả là rắc rối :) ) Bạn có thể dùng thử lisp sau đây, có thể sửa để rotate block với một góc xác định mà ko động chạm thay đổi gì đến block cả.

(defun bocdt (ss1 c) (entget (ssname ss1 c)))
;;;======================================
(defun C:Mblk (/ ssld sstmp Pbase obj Goc Dis Ptmp1 Ptmp2)
 (setq osm (getvar "osmode"))
 (setvar "osmode" 0)
 (Princ "\nChon 2 diem dinh huong di chuyen...")
 (Setq Ptmp1 (getpoint "\nDiem thu nhat (diem goc) ..."))
 (Setq	Ptmp2 (getpoint
	Ptmp1
	"\nDiem thu 2 (chi huong va khoang cach di chuyen) ..."
      )
Goc   (angle Ptmp1 Ptmp2)
Dis   (distance Ptmp1 Ptmp2)
 )

 (princ "Chon cac doi tuong block can di chuyen")
 (setq	ssld  (ssget '((0 . "Insert")))
Count (sslength ssld)
i1    0
  )
 (while (<= i1 (1- Count))
   (setq obj	(bocdt ssld i1)
  i1	(1+ i1)
  Pbase	(cdr (assoc 10 obj))
  Pdes	(polar Pbase goc dis)
   )

   (command "move" (cdr (assoc -1 obj)) "" Pbase pdes)
 )
 (setvar "osmode" osm)
)

 

Cái này dùng với những trường hợp "điểm chèn phải đi liền với đối tượng" (hố ga chẳng hạn - toạ độ hố ga thường lấy bằng cách lọc toạ độ block, di chuyển đối tượng trong block mà giữ nguyên điểm chèn thì đến lúc thi công...cống đặt một nơi, hố ga một nẻo :)

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
Bản thân điểm chèn của block chính là điểm có toạ độ (0 0 0) trong block. Vậy bạn chỉ cần vào block rồi move đối tượng đi một khoảng nào đó thì điểm chèn đối với block đó đã bị thay đổi đi còn gì.

 

Không thoả mãn! Chắc nataca ít sử dụng Block, nên đưa ra cách làm sai nguyên tắc

Bác gp14 nói đúng, em đã thử và làm đc với Block bình thường

Còn đối với block thuộc tính thì không đc (giả sử cốt cao độ)

Em sẽ thử cách của Snowman xem thế nào

Vậy mà mình cứ nghĩ có lệnh đổi base point

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
Muốn thay đổi vị trí của tất cả các block trong bản vẽ mà ko làm thay đổi điểm chèn của block (yêu cầu quả là rắc rối :) ) Bạn có thể dùng thử lisp sau đây, có thể sửa để rotate block với một góc xác định mà ko động chạm thay đổi gì đến block cả.

(defun bocdt (ss1 c) (entget (ssname ss1 c)))
;;;======================================
(defun C:Mblk (/ ssld sstmp Pbase obj Goc Dis Ptmp1 Ptmp2)
 (setq osm (getvar "osmode"))
 (setvar "osmode" 0)
 (Princ "\nChon 2 diem dinh huong di chuyen...")
 (Setq Ptmp1 (getpoint "\nDiem thu nhat (diem goc) ..."))
 (Setq	Ptmp2 (getpoint
	Ptmp1
	"\nDiem thu 2 (chi huong va khoang cach di chuyen) ..."
      )
Goc   (angle Ptmp1 Ptmp2)
Dis   (distance Ptmp1 Ptmp2)
 )

 (princ "Chon cac doi tuong block can di chuyen")
 (setq	ssld  (ssget '((0 . "Insert")))
Count (sslength ssld)
i1    0
  )
 (while (<= i1 (1- Count))
   (setq obj	(bocdt ssld i1)
  i1	(1+ i1)
  Pbase	(cdr (assoc 10 obj))
  Pdes	(polar Pbase goc dis)
   )

   (command "move" (cdr (assoc -1 obj)) "" Pbase pdes)
 )
 (setvar "osmode" osm)
)

 

Cái này dùng với những trường hợp "điểm chèn phải đi liền với đối tượng" (hố ga chẳng hạn - toạ độ hố ga thường lấy bằng cách lọc toạ độ block, di chuyển đối tượng trong block mà giữ nguyên điểm chèn thì đến lúc thi công...cống đặt một nơi, hố ga một nẻo :)

 

 

Có lẽ phải nói thế này thì đúng hơn - thay đổi tâm (điểm chèn) của block mà không làm thay đổi vị trí của block (vị trí tương đối của block) với các đối tượng khác.

Code của bạn chưa tính đến trường hợp block bị scale, đặc biệt là vừa scale, vừa rotate và scale với hệ số â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
Có lẽ phải nói thế này thì đúng hơn - thay đổi tâm (điểm chèn) của block mà không làm thay đổi vị trí của block (vị trí tương đối của block) với các đối tượng khác.

Code của bạn chưa tính đến trường hợp block bị scale, đặc biệt là vừa scale, vừa rotate và scale với hệ số âm

 

Chính xác! Đối tg scale sẽ bị thay đổi vị trí

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
Không thoả mãn! Chắc nataca ít sử dụng Block, nên đưa ra cách làm sai nguyên tắc

Bác gp14 nói đúng, em đã thử và làm đc với Block bình thường

Còn đối với block thuộc tính thì không đc (giả sử cốt cao độ)

Em sẽ thử cách của Snowman xem thế nào

Vậy mà mình cứ nghĩ có lệnh đổi base point

Block thường hay block thuộc tính thì cũng như nhau thôi. Với block khi bạn không tạo base point cho Block thì cad mặc định gốc 0,0,0 là điểm chèn cho nên khi bạn tạo base point parameter thì text thuộc tính sẽ giữ nguyên vị trí tương đối với base point còn các đối tượng khác sẽ bị move về điểm base point mặc định (gốc 0,0,0). Do đó, sau khi chèn base point parameter bạn phải dùng lệnh Battman để up lại cho block thuộc tí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
Có lẽ phải nói thế này thì đúng hơn - thay đổi tâm (điểm chèn) của block mà không làm thay đổi vị trí của block (vị trí tương đối của block) với các đối tượng khác.

Code của bạn chưa tính đến trường hợp block bị scale, đặc biệt là vừa scale, vừa rotate và scale với hệ số âm

 

Các bác đòi hỏi cao quá :) Em đâu fải SE pro như bác VNdesperados. em chỉ là dân CE thui, cách làm việc của em thế này, đang làm việc, gặp phải vấn đề gì cần lisp thì ngồi 5', 10' viết code xong là áp dụng ngay. Làm xong việc rồi gặp vấn đề khác lại viết lisp khác hoặc sửa lisp cũ, cốt sao dùng được là ổn rồi. Tính chất công việc của em là CAD thay fải, lisp tay trái. (Em mà ngồi coding mà sếp thấy là bị quát ngay :)) Lisp em post lên cũng như mã nguồn mở, bác nào có tg thì sửa lại cho hoàn thiện (Em nghĩ rằng chỉ cần sửa lại cho phù hợp với nhu cầu của mình là ổn, đỡ lằng nhằng). Bác Vndesperados SE pro viết một bộ công cụ hoàn chỉnh về block cho anh em dùng với ! :lol: (Em mới nhìn thấy cái dialog replace block của bác xong, hy vọng bác sớm có sản fẩm cho anh em dù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

Muốn thay đổi vị trí của tất cả các block trong bản vẽ mà ko làm thay đổi điểm chèn của block (yêu cầu quả là rắc rối :) ) Bạn có thể dùng thử lisp sau đây, có thể sửa để rotate block với một góc xác định mà ko động chạm thay đổi gì đến block cả.

(defun bocdt (ss1 c) (entget (ssname ss1 c)))
;;;======================================
(defun C:Mblk (/ ssld sstmp Pbase obj Goc Dis Ptmp1 Ptmp2)
 (setq osm (getvar "osmode"))
 (setvar "osmode" 0)
 (Princ "\nChon 2 diem dinh huong di chuyen...")
 (Setq Ptmp1 (getpoint "\nDiem thu nhat (diem goc) ..."))
 (Setq	Ptmp2 (getpoint
	Ptmp1
	"\nDiem thu 2 (chi huong va khoang cach di chuyen) ..."
      )
Goc   (angle Ptmp1 Ptmp2)
Dis   (distance Ptmp1 Ptmp2)
 )

 (princ "Chon cac doi tuong block can di chuyen")
 (setq	ssld  (ssget '((0 . "Insert")))
Count (sslength ssld)
i1    0
  )
 (while (<= i1 (1- Count))
   (setq obj	(bocdt ssld i1)
  i1	(1+ i1)
  Pbase	(cdr (assoc 10 obj))
  Pdes	(polar Pbase goc dis)
   )

   (command "move" (cdr (assoc -1 obj)) "" Pbase pdes)
 )
 (setvar "osmode" osm)
)

 

Cái này dùng với những trường hợp "điểm chèn phải đi liền với đối tượng" (hố ga chẳng hạn - toạ độ hố ga thường lấy bằng cách lọc toạ độ block, di chuyển đối tượng trong block mà giữ nguyên điểm chèn thì đến lúc thi công...cống đặt một nơi, hố ga một nẻo :)

Select objects: ; error: no function definition: BOCDT

bị lỗi rồi

bác nào rảnh xem hộ em

em dùng cad 2012

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ưa gặp bao giờ, hôm nay gặp ko biết làm thế nào cả

Nhờ các bác chỉ cách đổi vị trí tâm của Block

Lúc trước có viết cái này nhưng nay tìm không thấy pót lại nhé.

(defun c:dbl ()
(command "undo" "be")

(setq doituong1 (entsel "\nChon Block muon chinh diem chen"))
(while
(or
  (null doituong1)
  (/= "INSERT" (cdr (assoc 0 (entget (car doituong1)))))
)
(princ "\nDoi tuong khong phai la Block! Chon lai")
(setq doituong1 (entsel "\nChon Block muon chinh diem chen"))
)

(command "ucs" "ob" doituong1)
(setq DIEMCHENMOI (getpoint "\n Chon diem chen moi cho Block nay :"))
 (setq luubatdiem (getvar "osmode"))
(setvar "osmode" 0)
(command "layer" "s" 0 "")
(setq doituong (car doituong1))
(setq doituong (entget doituong))
(setq TENKHOI (cdr (assoc 2 doituong)))
(setq TENKHOIMOI (strcat TENKHOI "TAOTHEM"))
(setq TYLEX (cdr (assoc 41 doituong)))
(setq TYLEY (cdr (assoc 42 doituong)))
(setq DIEMTINH (list (/ (car DIEMCHENMOI) TYLEX) (/ (cadr DIEMCHENMOI) TYLEY)))
(setq XDIEMTINH (car DIEMTINH))
(setq YDIEMTINH (cadr DIEMTINH))
(setq  DAICHUAS (distance (list 0 0) DIEMTINH))
(setq  GOCCHUAS (angle (list 0 0) DIEMTINH))
(setq DIEMCHENTUONGDOI (polar (LIST 0 0) GOCCHUAS DAICHUAS))
(command ".INSERT" TENKHOI (LIST 0 0) 1 1 0)
(Command "EXPLODE" "last" "")
(Command "Block" TENKHOIMOI DIEMCHENTUONGDOI "Previous" "")
(command "ucs" "p")


(setq xx (ssget "X" (list( cons 0 "INSERT") (cons 2 TENKHOI))))

(setq L 0)
(setq M (sslength XX))
(while (< L M)
          (setq DTs (ssname XX L))
          (setq DTMs (entget DTs))
(command "ucs" "ob" DTs)
(setq TYLEX1 (cdr (assoc 41 DTMs)))
(setq TYLEY1 (cdr (assoc 42 DTMs)))
(setq DIEMDOI (list (* XDIEMTINH TYLEX1) (* YDIEMTINH TYLEY1)))

        (setq DTMs (subst (cons 2 TENKHOIMOI) (assoc 2 DTMs) DTMs))
        (entmod DTMs)
   (setq DIEMDOI (trans DIEMDOI 1 0))
   (setq DTMs (subst (cons 10 DIEMDOI) (assoc 10 DTMs) DTMs))
   (entmod DTMs) 
;(command "move" DTs "" (list 0 0) DIEMDOI)
(command "ucs" "p")
  (setq L (1+ L))
)


(setvar "osmode" luubatdiem)
(Command "Purge" "B" TENKHOI "Y" "Y") 
(command "rename" "b" TENKHOIMOI TENKHOI)
(command "undo" "end")

(princ (strcat "\nVua chinh tam cua block <" TENKHOI "> :" (itoa L) " doi tuong"))
(setvar "MODEMACRO" "**CHUC BAN LAM VIEC HIEU QUA** PHAM QUOC DUY - BINH SON - QUANG NGAI")
     (Princ))

  • Vote tăng 2

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ưa gặp bao giờ, hôm nay gặp ko biết làm thế nào cả

Nhờ các bác chỉ cách đổi vị trí tâm của Block

Bạn dùng lệnh edit block sau đó move điểm cần làm base mới về tọa độ 0,0 là được!

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  

×