Đến nội dung


Hình ảnh
* * * - - 8 Bình chọn

Viết lisp theo yêu cầu [phần 2]


  • Chủ đề bị khóa Chủ đề bị khóa
3783 replies to this topic

#3061 ngocnam.cad

ngocnam.cad

    biết vẽ ellipse

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

Đã gửi 19 January 2011 - 06:27 PM

Các bác ơi, em đã từng đọc ở diễn đàn mình và một số diễn đàn khác có nói về lisp đưa các trắc ngang vào viewport khung a3 nhưng down về mà làm mãi không dcj. MOng các bác giúp em với ạ. Hay bác nào có lisp đưa trắc ngang vào khung in bản vẽ a3 ti lệ 500 thì cho em xin. cám ơn các bác..hihi

hic hic. các bác ơi , giúp em với.... :)
  • 0

#3062 ngocnam.cad

ngocnam.cad

    biết vẽ ellipse

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

Đã gửi 19 January 2011 - 06:31 PM

sr các bác.. đay là chương trình mà thấy mọi ng gọi là xếp tn..mong các bác giúp đỡ :http://www.cadviet.com/upfiles/3/new_folder_7.rar
  • 0

#3063 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 19 January 2011 - 08:04 PM

cảm ơn lời góp ý của bác...e sẽ để ý hơn...thanks bác!!! mà bác có thể xem giúp e cái lisp dim (d_dc_da_qd_dg.lsp) ở trên với được ko...e ko thể dùng được...đánh lệnh d hay da thì ko thấy có ji.?

Mình đã thử sử dụng đi thử lại lisp đó rồi, vẫn bình thường.Bạn đã lấy lại phần mình sửa lỗi chưa ??? Mình post lại bên dưới, bạn thử xem sao.Nếu vẫn "không thấy gì" thì không còn cách nào khác, lúc sử dụng lệnh gặp lỗi ở chỗ nào bạn hãy ấn F2 và chụp lại màn hình cho ketxu xem thì mới biết được ^^..Như mình vẫn nói, hok ai chữa bệnh ung thư qua điện thoại cả :)

;free líp from cadviet.com @ gia_bach
(defun c:d() (VeDim "d"))
(defun c:dc() (VeDim "dc"))
(defun c:da() (VeDim "da"))
(defun c:qd() (VeDim "qd"))
(defun c:dg() (Vedim "dg"))
(defun VeDim(input / ov vl)
(defun *error* (msg)
(if ov (mapcar 'setvar vl ov)); reset Sys Vars
(if (not(wcmatch (strcase msg) "*BREAK,*EXIT*,*CANCEL*"))
(princ (strcat "\n** Error: " msg " **")))
(princ))

(setq vl '("clayer" "cmdecho") ; Sys Var list
ov (mapcar 'getvar vl)) ; Get Old values
(setvar "cmdecho" 0)
(if (tblsearch "layer" "08-dim")
(setvar "clayer" "08-dim")
(command "-layer" "M" "08-dim" "" ) )
(setvar "cmdecho" 1)
(cond
((= input "d")(command "_dimlinear"))
((= input "da")(command "_dimaligned"))
((= input "dc")(command "_dimcontinue"))
((= input "dg")(command "_dimangular"))
((= input "qd")(command "qdim"))
)
(while (= (getvar "CMDACTIVE") 1) (command pause))
(mapcar 'setvar vl ov) ; reset Sys Vars
(princ)
)
;;;;;;;

  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#3064 shitty

shitty

    biết zoom

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

Đã gửi 20 January 2011 - 02:58 PM

Mình đã thử sử dụng đi thử lại lisp đó rồi, vẫn bình thường.Bạn đã lấy lại phần mình sửa lỗi chưa ??? Mình post lại bên dưới, bạn thử xem sao.Nếu vẫn "không thấy gì" thì không còn cách nào khác, lúc sử dụng lệnh gặp lỗi ở chỗ nào bạn hãy ấn F2 và chụp lại màn hình cho ketxu xem thì mới biết được ^^..Như mình vẫn nói, hok ai chữa bệnh ung thư qua điện thoại cả :)


;free líp from cadviet.com @ gia_bach
(defun c:d() (VeDim "d"))
(defun c:dc() (VeDim "dc"))
(defun c:da() (VeDim "da"))
(defun c:qd() (VeDim "qd"))
(defun c:dg() (Vedim "dg"))
(defun VeDim(input / ov vl)
(defun *error* (msg)
(if ov (mapcar 'setvar vl ov)); reset Sys Vars
(if (not(wcmatch (strcase msg) "*BREAK,*EXIT*,*CANCEL*"))
(princ (strcat "\n** Error: " msg " **")))
(princ))

(setq vl '("clayer" "cmdecho") ; Sys Var list
ov (mapcar 'getvar vl)) ; Get Old values
(setvar "cmdecho" 0)
(if (tblsearch "layer" "08-dim")
(setvar "clayer" "08-dim")
(command "-layer" "M" "08-dim" "" ) )
(setvar "cmdecho" 1)
(cond
((= input "d")(command "_dimlinear"))
((= input "da")(command "_dimaligned"))
((= input "dc")(command "_dimcontinue"))
((= input "dg")(command "_dimangular"))
((= input "qd")(command "qdim"))
)
(while (= (getvar "CMDACTIVE") 1) (command pause))
(mapcar 'setvar vl ov) ; reset Sys Vars
(princ)
)
;;;;;;;

thanks bác !!!cuối cùng thì e cũng dùng được rồi...
có 1 lisp ve hatch cũng tham khảo trên diễn đàn nhưng e gà về lisp wá mong bác sửa giup với...đoạn lisp này sau khi hatch xong thi nó không tự chuyển về layer 00-09hatch và không có chế độ associative..e cũng mò thử thêm dòng (setvar "hpassoc" 1) vaf (setvar "hpgaptol" 1000.0) để có thể hatch cả miền hở nhưng bó tay :)...nên phai nhờ cao thủ giúp thôi.

;===== AUTO HATCH (hh) ========

(defun mkhatch(v_hatchtp v_scale v_angle data_m / i)
(command "hatch" v_hatchtp v_scale v_angle)
(setvar "hpassoc" 1)
(setq i 0)
(while (< i (length data_m)) (progn
(command (nth i data_m))
(setq i (+ i 1))
))
(command "")
)

(defun c:hh(/ data_m check)


(defun ah_import(/ p1 p2 old1 ent1 ent2 axa)
(if (= nil hscale_d) (setq hscale_d 1))
(setq old1 (getvar "osmode") check 1)
(setvar "osmode" 0)
(setq p1 '(0 0 0) p2 p1)
(command "line" p1 p2 "")

(setq data_m '())
(setq ent1 (entlast) ent2 ent1)

(princ ent1)

(setvar "osmode" old1)

(command "boundary")
(setq p1 (getpoint))
(while (not (= nil p1)) (progn

(command p1)


(setq p1 (getpoint))

))
(command "")

(setq ent1 (entnext ent1))

(princ ent1)
(if (= nil ent1) (setq check 0) (progn
(while (not (= nil ent1)) (progn
(setq data_m (append data_m (list ent1)))
(setq ent1 (entnext ent1))
))
))
(command "erase" ent2 "")
(princ)
)

(defun ah_procced(/ i s1)

(if (= 0 check) (princ "\ninvalid data") (progn
(initget 1 "0 WALL W GRASS GR GROUND G MARBLE M WC S SAND B BRICK")
(setq s1 (getkword "\n0/Wall/Grass/Ground/MARBLE/WC/Sand/BRICK : "))
(if (not (= nil s1)) (progn
(cond
((= "0" (strcase s1)) (mkhatch "dots" (* 1500 hscale_d) 0 data_m))
((= "WC" (strcase s1)) (mkhatch "ansi37" (* 2000 hscale_d) 45 data_m))
((or (= "GR" (strcase s1)) (= "GRASS" (strcase s1))) (progn
(mkhatch "CROSS" (* 500 hscale_d) 0 data_m)

))
((or (= "S" (strcase s1)) (= "SAND" (strcase s1))) (progn
(mkhatch "ar-sand" (* 30 hscale_d) 0 data_m)


))

((or (= "G" (strcase s1)) (= "GROUND" (strcase s1))) (mkhatch "hound" (* 3000 hscale_d) 0 data_m))
((or (= "M" (strcase s1)) (= "MARBLE" (strcase s1))) (mkhatch "ar-conc" (* 30 hscale_d) 0 data_m))
((or (= "B" (strcase s1)) (= "BRICK" (strcase s1))) (mkhatch "ar-b816c" (* 25 hscale_d) 0 data_m))
((or (= "W" (strcase s1)) (= "WALL" (strcase s1))) (mkhatch "ANSI31" (* 300 hscale_d) 0 data_m))
)
))

(command "erase")
(setq i 0)
(while (< i (length data_m)) (progn
(command (nth i data_m))
(setq i (+ i 1))
))
(command "")

))

(princ)
)
(ai_undo_push)
(ah_import)

(ah_procced)
(ai_undo_pop)
)


...!!!hok có bác nào giúp e sửa líp này với nhỉ..:)
  • 0

#3065 CaravenA

CaravenA

    biết pan

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

Đã gửi 21 January 2011 - 11:37 AM

Có thể viết dùm mình cái lisp bao chọn một vùng để sử dụng lệnh (Lengthen -> De -> nhập khoảng cách kéo dài) không,chứ select từng cái 1 thì lâu quá.Mình muốn chọn luôn toàn bộ bản vẽ.
Thanks
  • 0

#3066 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 21 January 2011 - 12:03 PM

Có thể viết dùm mình cái lisp bao chọn một vùng để sử dụng lệnh (Lengthen -> De -> nhập khoảng cách kéo dài) không,chứ select từng cái 1 thì lâu quá.Mình muốn chọn luôn toàn bộ bản vẽ.
Thanks

Lisp thì viết đuợc nhưng ...
làm thế nào đế phân biệt phía cần kéo dài (điểm đầu hay điểm cuối)?
  • 0

#3067 CaravenA

CaravenA

    biết pan

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

Đã gửi 21 January 2011 - 03:02 PM

Lisp thì viết đuợc nhưng ...
làm thế nào đế phân biệt phía cần kéo dài (điểm đầu hay điểm cuối)?

Mình muốn kéo dài cả 2 phía luôn.
Thanks
  • 0

#3068 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 21 January 2011 - 08:13 PM

Mình muốn kéo dài cả 2 phía luôn.
Thanks

đối tượng trên bản vẽ của bạn gồm những gì. Line, polyline hay arc hay tất cả mọi thứ...
  • 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!

#3069 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 22 January 2011 - 12:37 AM

Có thể viết dùm mình cái lisp bao chọn một vùng để sử dụng lệnh (Lengthen -> De -> nhập khoảng cách kéo dài) không,chứ select từng cái 1 thì lâu quá.Mình muốn chọn luôn toàn bộ bản vẽ.
Thanks

Mình cũng không rõ mục đích của bạn làm gì, k biết thừa ra 1 tí thì bản vẽ KT nó có đẹp k ^^


;free lisp from cadviet.com @ ketxu
(defun c:keodai (/ ss kc)
(vl-load-com)
(setq ss (ssget "_:L" '((0 . "LINE,LWPOLYLINE,ARC")))
kc (getdist "\nChieu dai phan dua ra: "))
(foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
(command "_.lengthen"
"_delta"
kc
(list ent (vlax-curve-getendpoint ent))
(list ent (vlax-curve-getstartpoint ent))
""
) ;kthuc command
) ; kthuc vong lap
(princ)
)


P/S : với Pline kín thì k sử dụng lengthen để kéo dài được, bạn muốn làm với các cạnh của nó thì phải explode ra.
- Với Arc, nếu đoạn kéo dài lớn hơn phần cung hở, nó sẽ không kéo dài nữa (bỏ qua), nếu 2*đoạn kéo dài lớn hơn cung hở, nó sẽ chỉ kéo dài 1 đầu
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#3070 CaravenA

CaravenA

    biết pan

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

Đã gửi 22 January 2011 - 09:00 AM

Mình cũng không rõ mục đích của bạn làm gì, k biết thừa ra 1 tí thì bản vẽ KT nó có đẹp k ^^


;free lisp from cadviet.com @ ketxu
(defun c:keodai (/ ss kc)
(vl-load-com)
(setq ss (ssget "_:L" '((0 . "LINE,LWPOLYLINE,ARC")))
kc (getdist "\nChieu dai phan dua ra: "))
(foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
(command "_.lengthen"
"_delta"
kc
(list ent (vlax-curve-getendpoint ent))
(list ent (vlax-curve-getstartpoint ent))
""
) ;kthuc command
) ; kthuc vong lap
(princ)
)


P/S : với Pline kín thì k sử dụng lengthen để kéo dài được, bạn muốn làm với các cạnh của nó thì phải explode ra.
- Với Arc, nếu đoạn kéo dài lớn hơn phần cung hở, nó sẽ không kéo dài nữa (bỏ qua), nếu 2*đoạn kéo dài lớn hơn cung hở, nó sẽ chỉ kéo dài 1 đầu

Thanks.Mình đã làm được rồi.
Mình thấy có vài bản vẽ kéo dài ra như vậy,và mình thích phong cách đó.thanks.
Ước gì mình cũng viết được lisp nhỉ.Chắc phải mày mò học thôi.:)
  • 0

#3071 phonui059

phonui059

    biết pan

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

Đã gửi 22 January 2011 - 11:23 AM

các bạn cho mình hỏi có lisp nào nối các point trên bản vẽ theo số thứ tự mình đánh vào không. hoặc cao thủ nào giúp mình với. mình không biết up bản vẽ vì mới tham gia dd. lisp kiểu như làm bản đồ địa hình thì trên bản vẽ có point và cao độ, các chương trình chạy đường dồng mức là nối các điểm có cùng một cao độ. Nhưng ở đây mình muốn có lisp là trên bản vẽ có point, ứng với mỗi point có số thứ tự điểm 1, 2, 3..........n. muốn nối point theo số thứ tự mình nhập được không. kiểu như đánh một lệnh gì đó rồi đánh số thứ tự điểm cần nối với nhau thì trên bản vẽ sẽ nối point theo stt mình nhập bằng đường line ấy. mong các bạn giúp đỡ.
  • 0

#3072 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 22 January 2011 - 11:44 AM

các bạn cho mình hỏi có lisp nào nối các point trên bản vẽ theo số thứ tự mình đánh vào không. hoặc cao thủ nào giúp mình với. mình không biết up bản vẽ vì mới tham gia dd. lisp kiểu như làm bản đồ địa hình thì trên bản vẽ có point và cao độ, các chương trình chạy đường dồng mức là nối các điểm có cùng một cao độ. Nhưng ở đây mình muốn có lisp là trên bản vẽ có point, ứng với mỗi point có số thứ tự điểm 1, 2, 3..........n. muốn nối point theo số thứ tự mình nhập được không. kiểu như đánh một lệnh gì đó rồi đánh số thứ tự điểm cần nối với nhau thì trên bản vẽ sẽ nối point theo stt mình nhập bằng đường line ấy. mong các bạn giúp đỡ.

Để upload file bạn :
1.Upload trực tiếp lên host diễn đàn : vào trang Upload phía bên trên tay phải -> thực hiện thao tác như hướng dẫn, sau đó copy link file trả về. Mục post bài có nút Insert Link, bạn kich vô đó và Paste đường dẫn vừa lấy được ở trang upload vào
2. Upload lên host khác, như MF chẳng hạn, rồi copy link và lại chèn vào bài viết như trên
P/S : ý tưởng của bạn thì mình hiểu rồi, nhưng mình thì bó tay.Hok biết stt điểm của bạn thể hiện bằng cách nào đây ^^
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#3073 phonui059

phonui059

    biết pan

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

Đã gửi 22 January 2011 - 12:08 PM

Để upload file bạn :
1.Upload trực tiếp lên host diễn đàn : vào trang Upload phía bên trên tay phải -> thực hiện thao tác như hướng dẫn, sau đó copy link file trả về. Mục post bài có nút Insert Link, bạn kich vô đó và Paste đường dẫn vừa lấy được ở trang upload vào
2. Upload lên host khác, như MF chẳng hạn, rồi copy link và lại chèn vào bài viết như trên
P/S : ý tưởng của bạn thì mình hiểu rồi, nhưng mình thì bó tay.Hok biết stt điểm của bạn thể hiện bằng cách nào đây ^^

rất cảm ơn bạn đã quan tâm. STT, POINT, đều liên quan đến nhau, tức là mình phun lên CAD từ máy toàn đạc điện tử trút ra có số thứ tự điểm, toạ độ x, toạ độ y, cao độ H(nếu có)
bạn xem bản vẽ có lẽ sẽ hiểu vấn đề ngay.
http://www.cadviet.c...es/3/upload.dwg
  • 0

#3074 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 22 January 2011 - 04:13 PM

các bạn cho mình hỏi có lisp nào nối các point trên bản vẽ theo số thứ tự mình đánh vào không. hoặc cao thủ nào giúp mình với. mình không biết up bản vẽ vì mới tham gia dd. lisp kiểu như làm bản đồ địa hình thì trên bản vẽ có point và cao độ, các chương trình chạy đường dồng mức là nối các điểm có cùng một cao độ. Nhưng ở đây mình muốn có lisp là trên bản vẽ có point, ứng với mỗi point có số thứ tự điểm 1, 2, 3..........n. muốn nối point theo số thứ tự mình nhập được không. kiểu như đánh một lệnh gì đó rồi đánh số thứ tự điểm cần nối với nhau thì trên bản vẽ sẽ nối point theo stt mình nhập bằng đường line ấy. mong các bạn giúp đỡ.

Sorry bạn vì dù có ý tưởng tổng quát hơn nhưng mình không cụ thể hóa thành code được, đành giúp bạn trong trường họp cá biệt này ( point trùng với điểm đặt text, nên để kẻ line mình sẽ chỉ cần duyệt qua text để xử lý thôi), bạn thử xem sao.Lisp cho phép bạn kẻ 1 loạt line từ điểm bắt đầu đến kết thúc, bạn chọn vùng cần kẻ, nhập vào số nhỏ nhất đến lớn nhất và xem KQ


;free lisp from cadviet.com @ ketxu
(defun c:pt2p(/ ss i ent so sslst mint maxt)
(vl-load-com)
;Loc text
(setq ss (ssget '((0 . "TEXT") (8 . "CT_SO"))) sslst (ssadd) i 0)
(setq mint (getint "\nKe line noi tu so : ")
maxt (getint "\nDen so : "))
(foreach x (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
(setq so (atoi(cdr(assoc 1 (entget x)))))
(if (and
(>= so mint)
(<= so maxt))
(setq sslst (ssadd x sslst))
)
)
;Sap xep lai
(setq
sslst (vl-remove-if 'listp (mapcar 'cadr (ssnamex sslst)))
sslst (vl-sort sslst
'(lambda (e1 e2)
(<
(atoi (cdr (assoc 1 (entget e1))))
(atoi (cdr (assoc 1 (entget e2))))
)
)
))
;Ke line
(setvar "clayer" "LINE")
(setq i 0)
(while (< i (length sslst))
(command ".line" (cdr(assoc 10 (entget (nth i sslst)))) (cdr (assoc 10 (entget (nth (1+ i) sslst)))) "")
(setq i (1+ i))
)
)


P/S : hình như file số liệu của bạn làm bằng phần mềm, phun thứ tự các điểm từ bé đến lớn, mình k bên chuyên ngành nên k biết, nên code trên thậm chí k cần sắp xếp lại list các phần tử được chọn (bỏ hẳn đoạn sắp xếp lại đi) thì nó vẫn kẻ đúng thứ tự, trừ khi bạn edit text ^^
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#3075 phonui059

phonui059

    biết pan

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

Đã gửi 22 January 2011 - 05:26 PM

Sorry bạn vì dù có ý tưởng tổng quát hơn nhưng mình không cụ thể hóa thành code được, đành giúp bạn trong trường họp cá biệt này ( point trùng với điểm đặt text, nên để kẻ line mình sẽ chỉ cần duyệt qua text để xử lý thôi), bạn thử xem sao.Lisp cho phép bạn kẻ 1 loạt line từ điểm bắt đầu đến kết thúc, bạn chọn vùng cần kẻ, nhập vào số nhỏ nhất đến lớn nhất và xem KQ

P/S : hình như file số liệu của bạn làm bằng phần mềm, phun thứ tự các điểm từ bé đến lớn, mình k bên chuyên ngành nên k biết, nên code trên thậm chí k cần sắp xếp lại list các phần tử được chọn (bỏ hẳn đoạn sắp xếp lại đi) thì nó vẫn kẻ đúng thứ tự, trừ khi bạn edit text ^^

Rất cảm ơn bạn ketxu. Lisp của bạn viết rất hay, mình rất vui. Nhưng bạn viết theo ý tưởng của mình thì tốt quá. ví dụ như bạn chọn vùng cần vẽ rồi nhập từng số thứ tự vẽ có được không: kiểu như
nhập số thứ tự bắt đầu? 1
số thứ tự tiếp theo? 2
số thứ tự tiếp theo? 5
số thứ tự tiếp theo? xxx
tương ứng mỗi lần nhập như thế thi vẽ line theo số thứ tự nhập vào vậy đó.
vì đây là file vẽ bản đồ, muốn vẽ 1 địa vật như nhà, đưòng GT hay một địa vật nào đó. số thứ tự cần nối không phải là cứ 1 rồi 2 rồi ...n. vì khi đo có thể quên hoặc đo diểm khác trước rồi mới quay lại cho nên stt cần nối không phải là từ 1 đến 2 rồi đến 3 rồi n được. cảm ơn bạn nhiều.
  • 0

#3076 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 23 January 2011 - 09:34 AM

Rất cảm ơn bạn ketxu. Lisp của bạn viết rất hay, mình rất vui. Nhưng bạn viết theo ý tưởng của mình thì tốt quá. ví dụ như bạn chọn vùng cần vẽ rồi nhập từng số thứ tự vẽ có được không: kiểu như
nhập số thứ tự bắt đầu? 1
số thứ tự tiếp theo? 2
số thứ tự tiếp theo? 5
số thứ tự tiếp theo? xxx
tương ứng mỗi lần nhập như thế thi vẽ line theo số thứ tự nhập vào vậy đó.
vì đây là file vẽ bản đồ, muốn vẽ 1 địa vật như nhà, đưòng GT hay một địa vật nào đó. số thứ tự cần nối không phải là cứ 1 rồi 2 rồi ...n. vì khi đo có thể quên hoặc đo diểm khác trước rồi mới quay lại cho nên stt cần nối không phải là từ 1 đến 2 rồi đến 3 rồi n được. cảm ơn bạn nhiều.

Hề hề hề,
Yêu cầu của bạn hoàn toàn có thể làm được dựa trên cái lisp bác ketxu đã viết, chỉ cần bạn thay đổi việc chọn các đối tượng theo vùng bằng cách pick chọn các đối tượng theo trình tự bạn cần mà thôi.
Bạn hãy thử xem nhé
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#3077 shitty

shitty

    biết zoom

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

Đã gửi 23 January 2011 - 09:40 AM

thanks bác !!!cuối cùng thì e cũng dùng được rồi...
có 1 lisp ve hatch cũng tham khảo trên diễn đàn nhưng e gà về lisp wá mong bác sửa giup với...đoạn lisp này sau khi hatch xong thi nó không tự chuyển về layer 00-09hatch và không có chế độ associative..e cũng mò thử thêm dòng (setvar "hpassoc" 1) vaf (setvar "hpgaptol" 1000.0) để có thể hatch cả miền hở nhưng bó tay :)...nên phai nhờ cao thủ giúp thôi.


;===== AUTO HATCH (hh) ========

(defun mkhatch(v_hatchtp v_scale v_angle data_m / i)
(command "hatch" v_hatchtp v_scale v_angle)
(setvar "hpassoc" 1)
(setq i 0)
(while (< i (length data_m)) (progn
(command (nth i data_m))
(setq i (+ i 1))
))
(command "")
)

(defun c:hh(/ data_m check)


(defun ah_import(/ p1 p2 old1 ent1 ent2 axa)
(if (= nil hscale_d) (setq hscale_d 1))
(setq old1 (getvar "osmode") check 1)
(setvar "osmode" 0)
(setq p1 '(0 0 0) p2 p1)
(command "line" p1 p2 "")

(setq data_m '())
(setq ent1 (entlast) ent2 ent1)

(princ ent1)

(setvar "osmode" old1)

(command "boundary")
(setq p1 (getpoint))
(while (not (= nil p1)) (progn

(command p1)


(setq p1 (getpoint))

))
(command "")

(setq ent1 (entnext ent1))

(princ ent1)
(if (= nil ent1) (setq check 0) (progn
(while (not (= nil ent1)) (progn
(setq data_m (append data_m (list ent1)))
(setq ent1 (entnext ent1))
))
))
(command "erase" ent2 "")
(princ)
)

(defun ah_procced(/ i s1)

(if (= 0 check) (princ "\ninvalid data") (progn
(initget 1 "0 WALL W GRASS GR GROUND G MARBLE M WC S SAND B BRICK")
(setq s1 (getkword "\n0/Wall/Grass/Ground/MARBLE/WC/Sand/BRICK : "))
(if (not (= nil s1)) (progn
(cond
((= "0" (strcase s1)) (mkhatch "dots" (* 1500 hscale_d) 0 data_m))
((= "WC" (strcase s1)) (mkhatch "ansi37" (* 2000 hscale_d) 45 data_m))
((or (= "GR" (strcase s1)) (= "GRASS" (strcase s1))) (progn
(mkhatch "CROSS" (* 500 hscale_d) 0 data_m)

))
((or (= "S" (strcase s1)) (= "SAND" (strcase s1))) (progn
(mkhatch "ar-sand" (* 30 hscale_d) 0 data_m)


))

((or (= "G" (strcase s1)) (= "GROUND" (strcase s1))) (mkhatch "hound" (* 3000 hscale_d) 0 data_m))
((or (= "M" (strcase s1)) (= "MARBLE" (strcase s1))) (mkhatch "ar-conc" (* 30 hscale_d) 0 data_m))
((or (= "B" (strcase s1)) (= "BRICK" (strcase s1))) (mkhatch "ar-b816c" (* 25 hscale_d) 0 data_m))
((or (= "W" (strcase s1)) (= "WALL" (strcase s1))) (mkhatch "ANSI31" (* 300 hscale_d) 0 data_m))
)
))

(command "erase")
(setq i 0)
(while (< i (length data_m)) (progn
(command (nth i data_m))
(setq i (+ i 1))
))
(command "")

))

(princ)
)
(ai_undo_push)
(ah_import)

(ah_procced)
(ai_undo_pop)
)


hix hok có bác nào xem giúp e với ah...cuối năm nên chắc các bác cũng bận :)....năm hết tết đến,chúc cho diễn đàn ngày càng phát triển,ban quản trị và các thành viên 1 năm mới nhiều sức khỏe và nhiều ...xiền...heh.
  • 0

#3078 phonui059

phonui059

    biết pan

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

Đã gửi 23 January 2011 - 11:27 AM

Hề hề hề,
Yêu cầu của bạn hoàn toàn có thể làm được dựa trên cái lisp bác ketxu đã viết, chỉ cần bạn thay đổi việc chọn các đối tượng theo vùng bằng cách pick chọn các đối tượng theo trình tự bạn cần mà thôi.
Bạn hãy thử xem nhé

Có thể mình yêu cầu hơi cao. ở đây mình muốn khi chọn vùng cần vẽ rồi mình nhập số thứ tự thì Cad tự tìm đến mà nối line vậy đó
( kiểu như lệnh find rồi zoomto ấy) Lisp của bác ketxu cũng rất hay. nếu như cần vẽ chỗ nào thì chọn vào vùng ấy thì nối sẽ đúng, nếu chọn nhiều hơn thì nó tự tìm các điểm nối theo thứ tự tăng dần thôi.
  • 0

#3079 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 23 January 2011 - 01:11 PM

hix hok có bác nào xem giúp e với ah...cuối năm nên chắc các bác cũng bận :)....năm hết tết đến,chúc cho diễn đàn ngày càng phát triển,ban quản trị và các thành viên 1 năm mới nhiều sức khỏe và nhiều ...xiền...heh.

F
File lisp của bạn mình k hiểu hết được, vì nó rườm rà quá, có lẽ bạn nếu ý tưởng để mọi người viết cái mới thì tốt hơn sửa code ^^

Có thể mình yêu cầu hơi cao. ở đây mình muốn khi chọn vùng cần vẽ rồi mình nhập số thứ tự thì Cad tự tìm đến mà nối line vậy đó
( kiểu như lệnh find rồi zoomto ấy) Lisp của bác ketxu cũng rất hay. nếu như cần vẽ chỗ nào thì chọn vào vùng ấy thì nối sẽ đúng, nếu chọn nhiều hơn thì nó tự tìm các điểm nối theo thứ tự tăng dần thôi.

Với yêu cầu nhập số đến đâu thì kéo chuột line đến đấy thì phải xử lý hàm pause, mình không rành về cái này lắm nên chắc phải từ từ nghiên cứu ^^
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#3080 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 23 January 2011 - 02:54 PM

Rất cảm ơn bạn ketxu. Lisp của bạn viết rất hay, mình rất vui. Nhưng bạn viết theo ý tưởng của mình thì tốt quá. ví dụ như bạn chọn vùng cần vẽ rồi nhập từng số thứ tự vẽ có được không: kiểu như
nhập số thứ tự bắt đầu? 1
số thứ tự tiếp theo? 2
số thứ tự tiếp theo? 5
số thứ tự tiếp theo? xxx
tương ứng mỗi lần nhập như thế thi vẽ line theo số thứ tự nhập vào vậy đó.
vì đây là file vẽ bản đồ, muốn vẽ 1 địa vật như nhà, đưòng GT hay một địa vật nào đó. số thứ tự cần nối không phải là cứ 1 rồi 2 rồi ...n. vì khi đo có thể quên hoặc đo diểm khác trước rồi mới quay lại cho nên stt cần nối không phải là từ 1 đến 2 rồi đến 3 rồi n được. cảm ơn bạn nhiều.

Sau khi tìm hiểu hàm pause, mình đã làm lại cho bạn đây.Nói chung lisp này khá khù khoằm và không được đẹp, lại chẳng liên quan gì tới lisp đầu tiên mình viết cho bạn, tức là phải mần lại từ đầu ý, nên có hơi lâu.Bạn thử dùng xem sao.Hy vọng đã đúng ý bạn. Lệnh vẫn như cũ

;;free lisp from cadviet.com @ ketxu
(defun c:pt2p(/ ss ssename listso spt sodautien sotieptheo )
(vl-load-com)
;Loc text, khoi tao bien
(setq ss (ssget '((0 . "TEXT") (8 . "CT_SO")))
ssename (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
listso '()
)
;list so
(foreach x ssename
(setq listso (append (list (atoi (cdr(assoc 1 (entget x))))) listso))
)
(setq listso (reverse listso))
;Kiem tra dau vao va ve
(setq sodautien (getint "\nSo dau tien:")
spt (check sodautien listso)
)
(while (= spt nil) (setq sodautien (getint "\nSo ban chon khong co trong tap chon.Xin chon lai:"))
(setq spt (check sodautien listso)))
(command ".line" (cdr(assoc 10 (entget (nth spt ssename)))))
(while (= 4 (getvar "CMDACTIVE")) (command pause))

(while (/= (setq sotieptheo (getint "\nNhap so tiep theo :")) nil)(setq spt (check sotieptheo listso))
(while (= spt nil) (setq sotieptheo (getint "\nSo ban chon khong co trong tap chon.Xin chon lai:"))
(setq spt (check sotieptheo listso)))
(command (cdr(assoc 10 (entget (nth spt ssename)))))
(while (= 4 (getvar "CMDACTIVE")) (command pause)))
)
;Kiem tra va lay so thu tu cua phan tu e trong list, neu khong tra ve nil
(defun check (e lst /)
(setq i 0)
(while (and (/= (setq e_i (nth i lst)) e) (< i (length lst)))
(setq i (1+ i))
)
(if (= e_i nil) (setq i nil))
i)



@Các bác viết lisp : Hiện nay với các code có dùng hàm vl, e thường áp dụng đoạn này
ssename (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
để lấy list ename của tập chọn ss thay vì hàm ss2ent của bác Hoành vì thấy gọn hơn , nhưng quả thực e chưa suy luận được cái nào tốt hơn cái nào, mong các bác phân tích và chỉ giáo
  • 2

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC