Đến nội dung


Hình ảnh
- - - - -

Lệnh offset đặc biệt


  • Please log in to reply
55 replies to this topic

#1 conghoa

conghoa

    biết lệnh attdef

  • Members
  • PipPipPipPipPipPip
  • 412 Bài viết
Điểm đánh giá: 88 (tàm tạm)

Đã gửi 26 August 2007 - 03:31 PM

Cảm ơn tác giả nhiều với lisp đơn giản nhưng khá hay!

Mục đính của lisp:

- Khi bổ chi tiết, bạn hay phải offset lớp vữa và màu của lớp vữa thường là khác với mầu tường. Bình thường khi sử dụng bạn phải offset nét tường đó ra 15 (chẳng hạn) rồi phải dùng tiếp lệnh ma để chuyển nó sang layer khác. Lisp này sẽ khắc phục những thao tác Ma nhàm chán đó.

- Lisp này sẽ offset và tự động đổi đối tượng mới sang lớp hiện hành.

- Tên lệnh : oo

(defun C:OO (/ lay lt os kc msg1 p1 msg2)
(setq os (getvar "Osmode")
lt (getvar "celtype")
lay (getvar "Clayer")
msg1 "\nVao khoang cach offset: "
kc (getreal msg1)
msg2 (strcat "Chon vat the muon offset:*" (rtos kc) "*")
);het setq
(setvar "OSMODE" 512)
(setq p1 (getpoint msg2))
(while p1
(command "offset" kc p1 pause "" "chprop" "l" "" "la" lay "lt" lt "")
(setq p1 (getpoint msg2))
);het while
(setvar "OSMODE" os)
)



@all Bạn nào có thể nâng cấp chương trình này không vậy, hiện tại mỗi lần dùng lệnh lại phải nhập lại kích thước offset, nó không lưu lại được kết quả nhập vào từ lần trước.

Thanks!
  • 0

#2 be_chanh

be_chanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 1712 Bài viết
Điểm đánh giá: 889 (rất tốt)

Đã gửi 26 August 2007 - 07:27 PM

thử cái này đi. chắc bạn sẽ hài lòng...
(defun c:oo(/ data_m)

(defun import_data(/ i)
(setq data_m (ssget))
(if (= nil distan_m) (setq distan_m 110.0))
(princ "Distance (")
(princ distan_m)
(princ "):")
(setq i (getreal ))
(if (not (= nil i)) (setq distan_m i))
)

(defun process(/ ent check)

(defun p_check()
(setq check 0)
(if (= "LINE" (cdr (assoc 0 ent))) (setq check 1))
(princ)
)

(defun p_d_offset(/ p1 p2 p3 p4)

(defun makeline(/ e2 e5)
; (princ ent)
; (setq e5 nil)
; (setq e5 (cdr (assoc 5 ent)))
; (princ e5)
; (if (= nil e5) (setq e5 ))

(setq la (list (cons 0 "LINE")
(cons 5 (cdr (assoc 5 ent)) )
(cons 8 (cdr (assoc 8 ent)) )
(cons 10 p3)
(cons 11 p4)
))
; (princ la)
(entmake la)
(princ)
)

(setq p1 (cdr (assoc 10 ent)) p2 (cdr (assoc 11 ent)) )
(if (not (= p1 p2)) (progn
(if (< (abs (- (nth 0 p1) (nth 0 p2))) 0.000001) (progn
(setq p3 (list (+ (nth 0 p1) distan_m) (nth 1 p1) (nth 2 p1) ) )
(setq p4 (list (+ (nth 0 p2) distan_m) (nth 1 p2) (nth 2 p2) ) )
(makeline)
(setq p3 (list (- (nth 0 p1) distan_m) (nth 1 p1) (nth 2 p1) ) )
(setq p4 (list (- (nth 0 p2) distan_m) (nth 1 p2) (nth 2 p2) ) )
(makeline)
))
(if (< (abs (- (nth 1 p1) (nth 1 p2))) 0.000001) (progn
(setq p3 (list (nth 0 p1) (+ (nth 1 p1) distan_m) (nth 2 p1) ) )
(setq p4 (list (nth 0 p2) (+ (nth 1 p2) distan_m) (nth 2 p2) ) )
(makeline)
(setq p3 (list (nth 0 p1) (- (nth 1 p1) distan_m) (nth 2 p1) ) )
(setq p4 (list (nth 0 p2) (- (nth 1 p2) distan_m) (nth 2 p2) ) )
(makeline)
))

))
(princ)
)

(if (not (= nil data_m)) (progn
(setq i 0)
(while (< i (sslength data_m)) (progn
(setq ent (entget (ssname data_m i)))
(p_check)
(if (= 1 check) (p_d_offset))
(setq i (+ i 1))
))
))
(princ)
)
(import_data)
(ai_undo_push)
(process)
(ai_undo_pop)
(princ)
)

  • 0

t: 097.323.1199 | m: cudstk@gmail.com | w: http://www.aicollect.com


#3 conghoa

conghoa

    biết lệnh attdef

  • Members
  • PipPipPipPipPipPip
  • 412 Bài viết
Điểm đánh giá: 88 (tàm tạm)

Đã gửi 27 August 2007 - 08:57 AM

Thanks jikibo Nhưng cái lisp của bạn có tính năng khác so với lisp của mình, nó chỉ offset đối tượng được chọn sang 2 bên thôi, còn cái mình post là nó offset đối tượng rồi chuyển layer của đối tượng mới sang lớp hiện hành mà :unsure:.

Lúc trước NguyenHoanh cũng có làm gíup mình 1 cái lisp tương tự cái của bạn nhưng cao cấp hơn 1 chút là nó tự động xoá cái đối tượng ban đầu, nhưng chẳng hiểu sao lúc dùng được lúc không :unsure:(
  • 0

#4 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 28 August 2007 - 08:28 AM

Cảm ơn tác giả nhiều với lisp đơn giản nhưng khá hay!

Mục đính của lisp:

- Khi bổ chi tiết, bạn hay phải offset lớp vữa và màu của lớp vữa thường là khác với mầu tường. Bình thường khi sử dụng bạn phải offset nét tường đó ra 15 (chẳng hạn) rồi phải dùng tiếp lệnh ma để chuyển nó sang layer khác. Lisp này sẽ khắc phục những thao tác Ma nhàm chán đó.

- Lisp này sẽ offset và tự động đổi đối tượng mới sang lớp hiện hành.

- Tên lệnh : oo

(defun C:OO (/ lay lt os kc msg1 p1 msg2)
(setq os (getvar "Osmode")
lt (getvar "celtype")
lay (getvar "Clayer")
msg1 "\nVao khoang cach offset: "
kc (getreal msg1)
msg2 (strcat "Chon vat the muon offset:*" (rtos kc) "*")
);het setq
(setvar "OSMODE" 512)
(setq p1 (getpoint msg2))
(while p1
(command "offset" kc p1 pause "" "chprop" "l" "" "la" lay "lt" lt "")
(setq p1 (getpoint msg2))
);het while
(setvar "OSMODE" os)
)
@all Bạn nào có thể nâng cấp chương trình này không vậy, hiện tại mỗi lần dùng lệnh lại phải nhập lại kích thước offset, nó không lưu lại được kết quả nhập vào từ lần trước.

Thanks!

Chương trình "mini" này chắc hợp ý bạn:

(defun C:OO(/ kc kc1 e msg)
(if (<= (setq kc (getvar "OFFSETDIST")) 0) (setq kc 20))
(setq msg (strcat "\nSpecial offset command\nOffset distance <" (rtos kc) ">:"))
(if (setq kc1 (getreal msg)) (setq kc kc1))
(while (setq e (car (entsel)))
(command "offset" kc e pause "")
(command "change" "L" "" "P" "LA" (getvar "clayer") "LT" (getvar "celtype") "")
)
)

  • 0

#5 bemove

bemove

    biết lệnh divide

  • Vip
  • PipPipPipPipPipPip
  • 446 Bài viết
Điểm đánh giá: 1308 (rất tốt)

Đã gửi 28 August 2007 - 08:34 AM

Ơ cái này cad06,07 hỗ trợ rồi mà

Command: o OFFSET
Current settings: Erase source=No Layer=Source OFFSETGAPTYPE=0
Specify offset distance or [Through/Erase/Layer] : L
Enter layer option for offset objects [Current/Source] : C

  • 2

#6 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 28 August 2007 - 09:37 AM

Ơ cái này cad06,07 hỗ trợ rồi mà

Command: o OFFSET
Current settings: Erase source=No Layer=Source OFFSETGAPTYPE=0
Specify offset distance or [Through/Erase/Layer] : L
Enter layer option for offset objects [Current/Source] : C

Cám ơn bemove, thật tình mình chưa biết tính năng này. Mặc dù trên máy mình có cài Cad2007 nhưng chỉ để nghiên cứu, và vẫn dùng Cad2002 cho công việc hàng ngày. Lý do: ở cơ quan làm việc theo nhóm trên mạng LAN, trong đó có rất nhiều máy đã hết khấu hao vẫn còn "cày". Nếu nâng cấp phần mềm, chúng nó chạy không nổi! Đành rằng, dùng cad đới sau có thể saveas theo đời trước, nhưng rất bất tiện và mất thời gian. Đành chấp nhận theo mặt bằng chung vậy.
Hơn nữa, theo xu thế hiện nay, chắc phải từ giã thói quen xài phần mềm "chùa" cho công việc. Không chừng R14 cũng không có mà dùng!
Vì những lý do trên, có lẽ lisp trên vẫn có giá trị sử dụng?
  • 0

#7 dzon

dzon

    Chưa sử dụng CAD

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

Đã gửi 28 August 2007 - 03:04 PM

Cám ơn bemove, thật tình mình chưa biết tính năng này. Mặc dù trên máy mình có cài Cad2007 nhưng chỉ để nghiên cứu, và vẫn dùng Cad2002 cho công việc hàng ngày. Lý do: ở cơ quan làm việc theo nhóm trên mạng LAN, trong đó có rất nhiều máy đã hết khấu hao vẫn còn "cày". Nếu nâng cấp phần mềm, chúng nó chạy không nổi! Đành rằng, dùng cad đới sau có thể saveas theo đời trước, nhưng rất bất tiện và mất thời gian. Đành chấp nhận theo mặt bằng chung vậy.
Hơn nữa, theo xu thế hiện nay, chắc phải từ giã thói quen xài phần mềm "chùa" cho công việc. Không chừng R14 cũng không có mà dùng!
Vì những lý do trên, có lẽ lisp trên vẫn có giá trị sử dụng?

Mình xin góp ý thêm cách sử dụng lenh offset
OFFSET
Through/Erase/Layer Through [Exit/Multiple/Undo]
M offset tiếp tục mà ko phải chọn lại đối tượng cũ
E Thoát lệnh
U Undo đối tượng vừa offset
Erase Yes/No Y xoá đối tượng chọn ban đầu
N ko xoa doi tuong chon ban dau
Layer Current/Source
C đối tượng mới thuộc layer hiện hành
S đối tượng mới cùng layer với đối tượng cũ
  • 0

#8 thoclep

thoclep

    biết lệnh offset

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

Đã gửi 08 November 2007 - 05:20 AM

Mình xin góp ý thêm cách sử dụng lenh offset
OFFSET
Through/Erase/Layer Through [Exit/Multiple/Undo]
M offset tiếp tục mà ko phải chọn lại đối tượng cũ
E Thoát lệnh
U Undo đối tượng vừa offset
Erase Yes/No Y xoá đối tượng chọn ban đầu
N ko xoa doi tuong chon ban dau
Layer Current/Source
C đối tượng mới thuộc layer hiện hành
S đối tượng mới cùng layer với đối tượng cũ

Toi cung xin bo sung them:
Doi voi tat ca cac cad thi co lenh "exoffset" cung tinh nang nhu tren
  • 0

#9 gp14

gp14

    DO TUAN GIAP

  • Moderator
  • PipPipPipPipPipPipPip
  • 1860 Bài viết
Điểm đánh giá: 1120 (rất tốt)

Đã gửi 09 November 2007 - 12:38 PM

Trong lệnh xline bạn cũng có chức năng offset, khi đó đường line mới được offset cũng sẽ tự chuyển sang layer hiện hành. Tuy nhiên nó chỉ có tác dụng vơi các bản cad trước còn các bản cad từ 2006 thì làm theo bác bemove là tiện nhất.
  • 0

#10 hdg2318

hdg2318

    biết lệnh mirror

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

Đã gửi 08 October 2009 - 10:15 PM

lisp của jikibo chỉ là offset 1 lần thành nhiều đối tượng với cùng 1 khoảng cách, và về cùng 1 hướng, gần giống với lệnh array.
bác nào có thể giúp em cái lisp offset đối tượng sang 2 bên: ( gõ lệnh, nhập khoảng cách, chọn đối tượng là tự động có 2 đối tượng mới ở về 2 fía của đối tượng ban đầu).
tìm trên diễn đàn mà toàn lisp offset giống array quá. thanks các bác trước.
  • 0

Có 2 cách để nhìn đời:
1 là : coi như chẳng có gì là huyền diệu
2 là : coi như mọi điều đều huyền diệu


Click here


#11 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 08 October 2009 - 10:28 PM

lisp của jikibo chỉ là offset 1 lần thành nhiều đối tượng với cùng 1 khoảng cách, và về cùng 1 hướng, gần giống với lệnh array.
bác nào có thể giúp em cái lisp offset đối tượng sang 2 bên: ( gõ lệnh, nhập khoảng cách, chọn đối tượng là tự động có 2 đối tượng mới ở về 2 fía của đối tượng ban đầu).
tìm trên diễn đàn mà toàn lisp offset giống array quá. thanks các bác trước.

Bạn sử dụng Lisp offset liên tục của Tue_NV nhé
Lisp offset liên tục - Bài viết số 10
  • 1

#12 hdg2318

hdg2318

    biết lệnh mirror

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

Đã gửi 09 October 2009 - 12:50 PM

Bạn sử dụng Lisp offset liên tục của Tue_NV nhé
Lisp offset liên tục - Bài viết số 10


cũng giống nhau thôi bạn àh, chỉ là offset liên tuc, và về 1 fía.
ban đọc lại yêu cầu về lisp của mình thì sẽ hiểu yêu cầu.
(chỉ cần nhập khoảng cách cần offset và chọn đối tượng 1 lần)

Thanks!
  • 0

Có 2 cách để nhìn đời:
1 là : coi như chẳng có gì là huyền diệu
2 là : coi như mọi điều đều huyền diệu


Click here


#13 hdg2318

hdg2318

    biết lệnh mirror

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

Đã gửi 09 October 2009 - 12:56 PM

sở dĩ mình đưa ra yêu cầu về lisp như vậy vì có rất nhiều trường hơp, khoảng offset sang 2 bên rất nhỏ, chỉ 1 vài mm. nên nếu zoom lên để chọn lại đối tượng (mặc dù không cần phải gõ lại lệnh và nhập lại khoảng cách) là rất mất thời gian.

mong nhận được sự giúp đỡ từ các bạn.
  • 0

Có 2 cách để nhìn đời:
1 là : coi như chẳng có gì là huyền diệu
2 là : coi như mọi điều đều huyền diệu


Click here


#14 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 09 October 2009 - 02:10 PM

sở dĩ mình đưa ra yêu cầu về lisp như vậy vì có rất nhiều trường hơp, khoảng offset sang 2 bên rất nhỏ, chỉ 1 vài mm. nên nếu zoom lên để chọn lại đối tượng (mặc dù không cần phải gõ lại lệnh và nhập lại khoảng cách) là rất mất thời gian.

mong nhận được sự giúp đỡ từ các bạn.

Bạn tham khảo lisp này xem:
http://www.cadviet.c...multioffset.lsp
  • 1

#15 hdg2318

hdg2318

    biết lệnh mirror

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

Đã gửi 09 October 2009 - 09:48 PM

thanks bạn, đúng cái mình cần đây rồi :bigsmile: :bigsmile:
bạn có thể cho mình hỏi thêm cách bỏ đi các lựa chọn xóa đối tượng gốc và chọn layer thì phải xóa đi đoạn code nào??

Thanks!
  • 0

Có 2 cách để nhìn đời:
1 là : coi như chẳng có gì là huyền diệu
2 là : coi như mọi điều đều huyền diệu


Click here


#16 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 12 October 2009 - 01:03 PM

thanks bạn, đúng cái mình cần đây rồi :bigsmile: :bigsmile:
bạn có thể cho mình hỏi thêm cách bỏ đi các lựa chọn xóa đối tượng gốc và chọn layer thì phải xóa đi đoạn code nào??
Thanks!

Chào hdg2318, đây là file multioffset, thiep chỉnh sửa lại để không còn hỏi lớp, và hỏi có xóa đối tượng gốc không:
http://www.cadviet.c...ong_hoi_lop.lsp
  • 0

#17 hdg2318

hdg2318

    biết lệnh mirror

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

Đã gửi 13 October 2009 - 10:16 PM

hì, mình làm được rồi, cảm ơn bạn nhiều nha
  • 0

Có 2 cách để nhìn đời:
1 là : coi như chẳng có gì là huyền diệu
2 là : coi như mọi điều đều huyền diệu


Click here


#18 hoa tam that

hoa tam that

    biết vẽ line

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

Đã gửi 14 November 2009 - 07:42 PM

thử cái này đi. chắc bạn sẽ hài lòng...

(defun c:oo(/ data_m)

(defun import_data(/ i)
(setq data_m (ssget))
(if (= nil distan_m) (setq distan_m 110.0))
(princ "Distance (")
(princ distan_m)
(princ "):")
(setq i (getreal ))
(if (not (= nil i)) (setq distan_m i))
)

(defun process(/ ent check)

(defun p_check()
(setq check 0)
(if (= "LINE" (cdr (assoc 0 ent))) (setq check 1))
(princ)
)

(defun p_d_offset(/ p1 p2 p3 p4)

(defun makeline(/ e2 e5)
; (princ ent)
; (setq e5 nil)
; (setq e5 (cdr (assoc 5 ent)))
; (princ e5)
; (if (= nil e5) (setq e5 ))

(setq la (list (cons 0 "LINE")
(cons 5 (cdr (assoc 5 ent)) )
(cons 8 (cdr (assoc 8 ent)) )
(cons 10 p3)
(cons 11 p4)
))
; (princ la)
(entmake la)
(princ)
)

(setq p1 (cdr (assoc 10 ent)) p2 (cdr (assoc 11 ent)) )
(if (not (= p1 p2)) (progn
(if (< (abs (- (nth 0 p1) (nth 0 p2))) 0.000001) (progn
(setq p3 (list (+ (nth 0 p1) distan_m) (nth 1 p1) (nth 2 p1) ) )
(setq p4 (list (+ (nth 0 p2) distan_m) (nth 1 p2) (nth 2 p2) ) )
(makeline)
(setq p3 (list (- (nth 0 p1) distan_m) (nth 1 p1) (nth 2 p1) ) )
(setq p4 (list (- (nth 0 p2) distan_m) (nth 1 p2) (nth 2 p2) ) )
(makeline)
))
(if (< (abs (- (nth 1 p1) (nth 1 p2))) 0.000001) (progn
(setq p3 (list (nth 0 p1) (+ (nth 1 p1) distan_m) (nth 2 p1) ) )
(setq p4 (list (nth 0 p2) (+ (nth 1 p2) distan_m) (nth 2 p2) ) )
(makeline)
(setq p3 (list (nth 0 p1) (- (nth 1 p1) distan_m) (nth 2 p1) ) )
(setq p4 (list (nth 0 p2) (- (nth 1 p2) distan_m) (nth 2 p2) ) )
(makeline)
))

))
(princ)
)

(if (not (= nil data_m)) (progn
(setq i 0)
(while (< i (sslength data_m)) (progn
(setq ent (entget (ssname data_m i)))
(p_check)
(if (= 1 check) (p_d_offset))
(setq i (+ i 1))
))
))
(princ)
)
(import_data)
(ai_undo_push)
(process)
(ai_undo_pop)
(princ)
)


chỉ áp dụng được đường thẳng không áp cho đường xiên được thật là chưa vui hết đâu
  • 0

#19 bienda

bienda

    biết vẽ polygon

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

Đã gửi 09 April 2011 - 07:10 AM

Nhân tiện đây xin hỏi mọi người luôn, mong được sự giúp đỡ
Mình cần lệnh offset đối tượng
- sang 2 phía
- đối tượng mới ở layer hiện hành

Giống lisp multioffset ở trên nhưng không hỏi nhiều như thế làm chậm quá trình vẽ
Đại loại là giống lisp của ssg, nhưng có điều là offset sang 2 bên

Chân thành cảm ơn
  • 0

#20 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 09 April 2011 - 08:46 AM

Nhân tiện đây xin hỏi mọi người luôn, mong được sự giúp đỡ
Mình cần lệnh offset đối tượng
- sang 2 phía
- đối tượng mới ở layer hiện hành

Giống lisp multioffset ở trên nhưng không hỏi nhiều như thế làm chậm quá trình vẽ
Đại loại là giống lisp của ssg, nhưng có điều là offset sang 2 bên

Chân thành cảm ơn

Bạn dùng thử cái này

(defun c:o2p()
(setq ob (vlax-ename->vla-object(car(entsel"\n chon doi tuong de offset: ")))
kc (* (getreal"\n Nhap khoang cach offset: ") 2)
sp (vlax-safearray->list(vlax-variant-value(vla-get-startpoint ob)))
ep (vlax-safearray->list(vlax-variant-value(vla-get-endpoint ob))))
(command "Mline" "j" "z" "s" kc sp ep "")
(command "explode" "l" "")
)

  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!