Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
17 replies to this topic

#1 daotukl

daotukl

    biết lệnh stretch

  • Members
  • PipPipPip
  • 162 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 04 November 2008 - 06:08 PM

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.c...pfiles/P01B.dwg
thanks các bác
  • 0

#2 MANHHUNGXDA

MANHHUNGXDA

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 926 Bài viết
Điểm đánh giá: 458 (tốt)

Đã gửi 04 November 2008 - 07:23 PM

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.c...pfiles/P01B.dwg
thanks các bác

Cái này là cầu đwưọc uớc thấy đấy nhé
http://tailieukythua...o...
  • 1
Hãy ước cho trọn 1 ước mơ!

#3 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 04 November 2008 - 08:56 PM

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.c...pfiles/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)
)

  • 1

#4 daotukl

daotukl

    biết lệnh stretch

  • Members
  • PipPipPip
  • 162 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 05 November 2008 - 06:11 AM

Cái này là cầu đwưọc uớc thấy đấy nhé
http://tailieukythua...o...

Em làm thử rồi mà không thấy cái dòng "blockcaninsert" đâu hết
  • 0

#5 daotukl

daotukl

    biết lệnh stretch

  • Members
  • PipPipPip
  • 162 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 05 November 2008 - 06:16 AM

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
  • 0

#6 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 05 November 2008 - 08:19 AM

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)
)

  • 1

#7 daotukl

daotukl

    biết lệnh stretch

  • Members
  • PipPipPip
  • 162 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 05 November 2008 - 08:33 AM

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
  • 0

#8 daotukl

daotukl

    biết lệnh stretch

  • Members
  • PipPipPip
  • 162 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 05 November 2008 - 09:28 AM

à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 -_-
  • 0

#9 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 05 November 2008 - 11:41 AM

à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 đó.
  • 1

#10 daotukl

daotukl

    biết lệnh stretch

  • Members
  • PipPipPip
  • 162 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 05 November 2008 - 12:05 PM

'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:
  • 0

#11 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 05 November 2008 - 01:19 PM

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)
)

  • 0

#12 daotukl

daotukl

    biết lệnh stretch

  • Members
  • PipPipPip
  • 162 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 11 November 2008 - 01:19 PM

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
  • 0

#13 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 11 November 2008 - 01:53 PM

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)
)

  • 0

#14 daotukl

daotukl

    biết lệnh stretch

  • Members
  • PipPipPip
  • 162 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 24 November 2008 - 10:08 AM

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)
)

  • 0

#15 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 24 November 2008 - 10:42 AM

...
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à.
  • 0

#16 daotukl

daotukl

    biết lệnh stretch

  • Members
  • PipPipPip
  • 162 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 24 November 2008 - 11:36 AM

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
  • 0

#17 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 24 November 2008 - 01:01 PM

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
  • 0

#18 almodeus

almodeus

    biết vẽ arc

  • Members
  • PipPip
  • 43 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 15 October 2010 - 04:45 PM

không cần cầu kỳ vậy đâu, bạn hãy sài lệnh Divide voi tinh năng chèn block là được
  • 0