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

insert block theo khoảng cách cho trước và nằm giữa hai điểm

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

em muốn insert môt block theo khoảng cách bằng nhau cho trước và nằm giữa 2 điểm (chọn block=> điểm đầu điểm cuối rồi nhập khoảng cách)

hiện giờ em chỉ biết dùng các lệnh hơi thủ công (insert + array + move... )

các bác coi hình :

http://www.cadviet.com/upfiles/P01B.dwg

thanks các 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
em muốn insert môt block theo khoảng cách bằng nhau cho trước và nằm giữa 2 điểm (chọn block=> điểm đầu điểm cuối rồi nhập khoảng cách)

hiện giờ em chỉ biết dùng các lệnh hơi thủ công (insert + array + move... )

các bác coi hình :

http://www.cadviet.com/upfiles/P01B.dwg

thanks các bác

Cái này là cầu đwưọc uớc thấy đấy nhé

http://tailieukythuat.com/index.php?showto...entry1515

  • Vote tăng 1

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 muốn insert môt block theo khoảng cách bằng nhau cho trước và nằm giữa 2 điểm (chọn block=> điểm đầu điểm cuối rồi nhập khoảng cách)

hiện giờ em chỉ biết dùng các lệnh hơi thủ công (insert + array + move... )

các bác coi hình :

http://www.cadviet.com/upfiles/P01B.dwg

thanks các bác

 

lệnh là CBL (Chèn BLock)

- Lúc chương trình hỏi tên block: nếu bạn muốn tên giống lần dùng lệnh trước đó chỉ cần nhấn enter, nếu bạn không nhớ tên block hãy nhập * rồi enter để pick vào 1 block trên màn hình.

- Lúc chương trình hỏi khoảng cách: nếu bạn không nhớ khoảng cách giữa 2 block là bao nhiêu, chỉ nhớ là có k khoảng nằm giữa hai điểm, bạn chỉ cần nhập -k. Ví dụ nếu bạn muốn divide khoảng giữa hai điểm là 5 khoảng, bạn nhập vào -5. K không nhất thiết phải là số nguyên, bạn có thể nhập vào -4.5.

 

CODE
(defun c:cbl( / tmp ok p1 p2 kc cur l)

(princ "\nCBL - free lisp from CADViet.com")

(if (not bln) (setq bln "*"))

(while (not ok)

(setq tmp (getstring t (strcat "\nTen block, nhap dau * de pick block: <" (if bln bln "") ">: "))

tmp (if (or (not tmp) (= tmp "")) bln tmp)

ok (or (tblsearch "block" tmp) (= tmp "*"))

)

(if (not ok) (alert (strcat "Khong co block " (if tmp tmp ""))))

)

 

(if (= tmp "*") (setq tmp (cdr (assoc 2 (entget (car (entsel "\nHay pick vao block: ")))))))

 

(setq p1 (getpoint "\nHay vao diem thu nhat: ")

p2 (trans (getpoint p1 "\nHay vao diem thu hai: ") 1 0)

kc (getdist p1 "\nHay vao khoang cach: ")

p1 (trans p1 1 0)

)

 

(setq bln tmp

cur 0.0

a (angle p1 p2)

l (distance p1 p2)

)

(if (< kc 0) (setq kc (/ l kc -1.0)))

(while (> l (+ cur 0.001))

(entmake (list (cons 0 "insert") (cons 10 (polar p1 a cur)) (cons 2 bln)))

(setq cur (+ cur kc))

)

(entmake (list (cons 0 "insert") (cons 10 (polar p1 a l)) (cons 2 bln)))

(princ)

)

  • Vote tăng 1

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
lệnh là CBL (Chèn BLock)

- Lúc chương trình hỏi tên block: nếu bạn muốn tên giống lần dùng lệnh trước đó chỉ cần nhấn enter, nếu bạn không nhớ tên block hãy nhập * rồi enter để pick vào 1 block trên màn hình.

- Lúc chương trình hỏi khoảng cách: nếu bạn không nhớ khoảng cách giữa 2 block là bao nhiêu, chỉ nhớ là có k khoảng nằm giữa hai điểm, bạn chỉ cần nhập -k. Ví dụ nếu bạn muốn divide khoảng giữa hai điểm là 5 khoảng, bạn nhập vào -5. K không nhất thiết phải là số nguyên, bạn có thể nhập vào -4.5.

 

(defun c:cbl( / tmp ok p1 p2 kc cur l)
 (princ "\nCBL - free lisp from CADViet.com")
 (if (not bln) (setq bln "*"))
 (while (not ok)
    (setq tmp (getstring t (strcat "\nTen block, nhap dau * de pick block: <" (if bln bln "") ">: "))
   tmp (if (or (not tmp) (= tmp "")) bln tmp)
   ok (or (tblsearch "block" tmp) (= tmp "*"))
    )
    (if (not ok) (alert (strcat "Khong co block " (if tmp tmp ""))))
 )

 (if (= tmp "*") (setq tmp (cdr (assoc 2 (entget (car (entsel "\nHay pick vao block: ")))))))

 (setq p1 (getpoint "\nHay vao diem thu nhat: ")
p2 (trans (getpoint p1 "\nHay vao diem thu hai: ") 1 0)
kc (getdist p1 "\nHay vao khoang cach: ")
       p1 (trans p1 1 0)
 )

 (setq bln tmp
cur 0.0
a (angle p1 p2)
l (distance p1 p2)
 )  
 (if (< kc 0) (setq kc (/ l kc -1.0)))
 (while (> l (+ cur 0.001))
   (entmake (list (cons 0 "insert") (cons 10 (polar p1 a cur)) (cons 2 bln)))
   (setq cur (+ cur kc))
 )
 (entmake (list (cons 0 "insert") (cons 10 (polar p1 a l)) (cons 2 bln)))
 (princ)
)

bác hoành ơi em muốn hai đầu nó có khoảng trống (khoảng trống đó <=1/2@)

thanks bác rất nhiều

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ác hoành ơi em muốn hai đầu nó có khoảng trống (khoảng trống đó <=1/2@)

thanks bác rất nhiều

Lệnh là CBL1 dưới đây giống CBL ngoại trừ trường hợp khi khoảng cách giữa 2 điểm không chẵn với khoảng cách giữa hai block thì chương trình sẽ trừ khoảng trống hai bên bằng nhau:

(defun c:cbl1 (/ tmp ok p1 p2 kc cur l)
 (princ "\nCBL - free lisp from CADViet.com")
 (if (not bln)
   (setq bln "*")
 )
 (while (not ok)
   (setq tmp (getstring t
		 (strcat "\nTen block, nhap dau * de pick block: <"
			 (if bln
			   bln
			   ""
			 )
			 ">: "
		 )
      )
  tmp (if (or (not tmp) (= tmp ""))
	bln
	tmp
      )
  ok  (or (tblsearch "block" tmp) (= tmp "*"))
   )
   (if	(not ok)
     (alert (strcat "Khong co block "
	     (if tmp
	       tmp
	       ""
	     )
     )
     )
   )
 )

 (if (= tmp "*")
   (setq
     tmp (cdr
    (assoc 2 (entget (car (entsel "\nHay pick vao block: "))))
  )
   )
 )

 (setq	p1 (getpoint "\nHay vao diem thu nhat: ")
p2 (trans (getpoint p1 "\nHay vao diem thu hai: ") 1 0)
kc (getdist p1 "\nHay vao khoang cach: ")
p1 (trans p1 1 0)
 )

 (setq	bln tmp	
a   (angle p1 p2)
l   (distance p1 p2)
cur (/ (- l (* kc (float (fix (/ l kc))))) 2.0)
 )
 (if (< kc 0)
   (setq kc (/ l kc -1.0))
 )
 (while (> l (- cur 0.001))
   (entmake (list (cons 0 "insert")
	   (cons 10 (polar p1 a cur))
	   (cons 2 bln)
     )
   )
   (setq cur (+ cur kc))
 )  
 (princ)
)

  • Vote tăng 1

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
Lệnh là CBL1 dưới đây giống CBL ngoại trừ trường hợp khi khoảng cách giữa 2 điểm không chẵn với khoảng cách giữa hai block thì chương trình sẽ trừ khoảng trống hai bên bằng nhau:

(defun c:cbl1 (/ tmp ok p1 p2 kc cur l)
 (princ "\nCBL - free lisp from CADViet.com")
 (if (not bln)
   (setq bln "*")
 )
 (while (not ok)
   (setq tmp (getstring t
		 (strcat "\nTen block, nhap dau * de pick block: <"
			 (if bln
			   bln
			   ""
			 )
			 ">: "
		 )
      )
  tmp (if (or (not tmp) (= tmp ""))
	bln
	tmp
      )
  ok  (or (tblsearch "block" tmp) (= tmp "*"))
   )
   (if	(not ok)
     (alert (strcat "Khong co block "
	     (if tmp
	       tmp
	       ""
	     )
     )
     )
   )
 )

 (if (= tmp "*")
   (setq
     tmp (cdr
    (assoc 2 (entget (car (entsel "\nHay pick vao block: "))))
  )
   )
 )

 (setq	p1 (getpoint "\nHay vao diem thu nhat: ")
p2 (trans (getpoint p1 "\nHay vao diem thu hai: ") 1 0)
kc (getdist p1 "\nHay vao khoang cach: ")
p1 (trans p1 1 0)
 )

 (setq	bln tmp	
a   (angle p1 p2)
l   (distance p1 p2)
cur (/ (- l (* kc (float (fix (/ l kc))))) 2.0)
 )
 (if (< kc 0)
   (setq kc (/ l kc -1.0))
 )
 (while (> l (- cur 0.001))
   (entmake (list (cons 0 "insert")
	   (cons 10 (polar p1 a cur))
	   (cons 2 bln)
     )
   )
   (setq cur (+ cur kc))
 )  
 (princ)
)

THANKS bác nhiều

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

àh mà bác hoành ơi có cách nào insert block theo đúng layer của nó và nó nhớ khoảng cách @ không bác . lisp của bác sài tốt lắm

thanks bác thêm lần nữa

lúc nào có dịp ra hà nội em mời 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
àh mà bác hoành ơi có cách nào insert block theo đúng layer của nó và nó nhớ khoảng cách @ không bác . lisp của bác sài tốt lắm

thanks bác thêm lần nữa

lúc nào có dịp ra hà nội em mời bác -_-

'Layer của nó' là layer nào?

 

Hiện nay, các block được chèn vào sẽ mang layer hiện hành. Khoảng cách @ đang được nhớ, bạn chỉ cần nhấn enter là sử dụng khoảng cách @ của lần trước đó.

  • Vote tăng 1

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
'Layer của nó' là layer nào?

 

Hiện nay, các block được chèn vào sẽ mang layer hiện hành. Khoảng cách @ đang được nhớ, bạn chỉ cần nhấn enter là sử dụng khoảng cách @ của lần trước đó.

 

khoảng cách @ của lần trước đó nó không nhớ bác hoành ơi:(tên lệnh em sửa lại là II)

 

Command:

II

CBL - free lisp from CADViet.com

Ten block, nhap dau * de pick block: <M16 FF>:

Hay vao diem thu nhat:

Hay vao diem thu hai:

Hay vao khoang cach: 180

Command:

Command: II

CBL - free lisp from CADViet.com

Ten block, nhap dau * de pick block: <M16 FF>:

Hay vao diem thu nhat:

Hay vao diem thu hai:

Hay vao khoang cach:

; error: bad argument type: numberp: nil

Command:

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
khoảng cách @ của lần trước đó nó không nhớ bác hoành ơi:(tên lệnh em sửa lại là II)

 

Sorry mình nhầm, lệnh CBL2 dưới đây sẽ nhớ khoảng cách. Khi pick vào block bằng cách nhập tên *, chương trình sẽ lưu luôn layer của block gốc để cho vào các block được tạo ra sau này.

(defun c:cbl2 (/ tmp ok p1 p2 tmpkc cur l)
 (princ "\nCBL2 - free lisp from CADViet.com")
 (if (not bln)
   (setq bln "*")
 )
 (while (not ok)
   (setq tmp (getstring t
		 (strcat "\nTen block, nhap dau * de pick block: <"
			 (if bln
			   bln
			   ""
			 )
			 ">: "
		 )
      )
  tmp (if (or (not tmp) (= tmp ""))
	bln
	tmp
      )
  ok  (or (tblsearch "block" tmp) (= tmp "*"))
   )
   (if	(not ok)
     (alert (strcat "Khong co block "
	     (if tmp
	       tmp
	       ""
	     )
     )
     )
   )
 )

 (if (= tmp "*")
   (setq
     tmp (cdr
    (assoc 2 (entget (setq entbl (car (entsel "\nHay pick vao block: ")))))
  )
     curlay (assoc 8 (entget entbl))
   )
 )

 (setq	p1 (getpoint "\nHay vao diem thu nhat: ")
p2 (trans (getpoint p1 "\nHay vao diem thu hai: ") 1 0)
tmpkc (getdist p1 (strcat "\nHay vao khoang cach: <" (if kc (rtos kc) "") ">"))
kc (if tmpkc tmpkc kc)
p1 (trans p1 1 0)
 )

 (setq	bln tmp
a   (angle p1 p2)
l   (distance p1 p2)
cur (/ (- l (* kc (float (fix (/ l kc))))) 2.0)
 )
 (if (< kc 0)
   (setq kc (/ l kc -1.0))
 )
 (while (> l (- cur 0.001))
   (entmake (list (cons 0 "insert")
	   (cons 10 (polar p1 a cur))
	   (cons 2 bln)
	   (if curlay curlay (cons 0 "insert"))
     )
   )
   (setq cur (+ cur kc))
 )
 (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

khi em insert một block bằng lệnh này trong một Model views xéo so với trục toạ độ tuyệt đối thì block nó bị xéo theo mà em hay làm trên các cửa sổ viewports. có cách nào khắc phục không các 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
khi em insert một block bằng lệnh này trong một Model views xéo so với trục toạ độ tuyệt đối thì block nó bị xéo theo mà em hay làm trên các cửa sổ viewports. có cách nào khắc phục không các bác

block được chèn theo phương của UCS World.

 

Lệnh CBL3 dưới đây sẽ insert block dọc theo 2 điểm pick:

(defun c:cbl3 (/ tmp ok p1 p2 tmpkc cur l)
 (princ "\nCBL3 - free lisp from CADViet.com")
 (if (not bln)
   (setq bln "*")
 )
 (while (not ok)
   (setq tmp (getstring t
		 (strcat "\nTen block, nhap dau * de pick block: <"
			 (if bln
			   bln
			   ""
			 )
			 ">: "
		 )
      )
  tmp (if (or (not tmp) (= tmp ""))
	bln
	tmp
      )
  ok  (or (tblsearch "block" tmp) (= tmp "*"))
   )
   (if	(not ok)
     (alert (strcat "Khong co block "
	     (if tmp
	       tmp
	       ""
	     )
     )
     )
   )
 )

 (if (= tmp "*")
   (setq
     tmp    (cdr
       (assoc 2
	      (entget
		(setq entbl (car (entsel "\nHay pick vao block: ")))
	      )
       )
     )
     curlay (assoc 8 (entget entbl))
   )
 )

 (setq	p1    (getpoint "\nHay vao diem thu nhat: ")
p2    (trans (getpoint p1 "\nHay vao diem thu hai: ") 1 0)
tmpkc (getdist p1
	       (strcat "\nHay vao khoang cach: <"
		       (if kc
			 (rtos kc)
			 ""
		       )
		       ">"
	       )
      )
kc    (if tmpkc
	tmpkc
	kc
      )
p1    (trans p1 1 0)
 )

 (setq	bln tmp
a   (angle p1 p2)
l   (distance p1 p2)
cur (/ (- l (* kc (float (fix (/ l kc))))) 2.0)
 )
 (if (< kc 0)
   (setq kc (/ l kc -1.0))
 )
 (while (> l (- cur 0.001))
   (entmake (list (cons 0 "insert")
	   (cons 10 (polar p1 a cur))
	   (cons 2 bln)
	   (if curlay
	     curlay
	     (cons 0 "insert")
	   )
	   (cons 50 a)
     )
   )
   (setq cur (+ cur kc))
 )
 (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

Bác hoành oi sửa dùm em cái lisp này nhé nó là lisp tính thang trên diễn đàn. nhưng không tính được số lẻ sau dấu phẩy nó toàn làm tròn số

(em không muốn mở thêm topic và cung sert nhiều rồi )

cám ơn bác trước

(defun c:vt( / p c r sb oldos)
(setq
p (getpoint "\nVao diem dau tien: ")
c (getdist p "\nVao chieu cao bac: ")
r (getdist p "\nVao chieu rong bac: ")
sb (getint "\nVao so bac: ")
oldos (getvar "osmode")
)
(setvar "osmode" 0)
(command ".pline")
(command p)
(repeat sb
(command (strcat "@0," (rtos c)))
(command (strcat "@" (rtos r) ",0"))
)
(command "")
(setvar "osmode" oldos)
(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
...

nhưng không tính được số lẻ sau dấu phẩy nó toàn làm tròn số

...

 

daotukl giải thích rõ "không tính được số lẻ sau dấu phẩy nó toàn làm tròn số" là sao nhỉ?

 

chiều cao, chiều rộng bậc thang vẽ ra vẫn có số lẻ 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
daotukl giải thích rõ "không tính được số lẻ sau dấu phẩy nó toàn làm tròn số" là sao nhỉ?

 

chiều cao, chiều rộng bậc thang vẽ ra vẫn có số lẻ mà.

ví dụ em cho chiều cao bậc là 175.5 mm thi nó hiểu là 176mm và nếu số bậc là 10 thi landing nó tính là 1760 mm chứ không phải là 1775 mm sai 5 mm

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
ví dụ em cho chiều cao bậc là 175.5 mm thi nó hiểu là 176mm và nếu số bậc là 10 thi landing nó tính là 1760 mm chứ không phải là 1775 mm sai 5 mm

Có thể biến hệ thống LUPREC có giá trị = 0.

 

tại dấu nhắc lệnh bạn gõ LUPREC và nhập số chữ số thập phân cần tính. (ví dụ 2)

 

Bạn tham khảo thêm phần Help của hàm Rtos

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

×