Đến nội dung


Hình ảnh
- - - - -

Chèn points vào vị trí text


  • Please log in to reply
9 replies to this topic

#1 tnmtpc

tnmtpc

    biết dimcontinue

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

Đã gửi 26 November 2008 - 08:09 PM

Nhờ viết giúp lisp, nội dung là:
Chọn các text, Enter, -> các point sẽ tự động chèn vào từng vị trí điểm chèn của các text đã chọn (point tạo ra trên layer "points")
Thanks!
  • 0

#2 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 27 November 2008 - 05:59 AM

Nhờ viết giúp lisp, nội dung là:
Chọn các text, Enter, -> các point sẽ tự động chèn vào từng vị trí điểm chèn của các text đã chọn (point tạo ra trên layer "points")
Thanks!

Điểm chèn text mà bạn nói có phải là chính là chế độ bắt điểm Insert của AutoCAD.
Nhưng mục đích sau cùng của bạn là gì vậy?
Bạn có thể nói rõ mục đích không?
  • 0

#3 tnmtpc

tnmtpc

    biết dimcontinue

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

Đã gửi 27 November 2008 - 09:26 AM

Điểm chèn text mà bạn nói có phải là chính là chế độ bắt điểm Insert của AutoCAD.
Nhưng mục đích sau cùng của bạn là gì vậy?
Bạn có thể nói rõ mục đích không?

Để trực quan hơn, mình gửi file mẫu để tham khảo, file1 trước khi dùng lisp, file2 sau khi dùng lisp. cám ơn bạn đã quan tâm
http://www.cadviet.c...Drawing1_18.dwg
http://www.cadviet.c.../Drawing2_7.dwg
  • 0

#4 SONCAD

SONCAD

    biết lệnh adcenter

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

Đã gửi 27 November 2008 - 09:43 AM

Cách này chủ yếu là ðể thể hiện ðiểm ðo (Cao ðộ ) trên bình ðồ ðịa hình. Các point sẽ ðýợc chèn theo ðịnh dạng của text hiện tại (mid, left, right...). Cách của bạn dùng là ðể nội suy cao ðộ ðiểm ðo và "hợp thức hóa" chúng bằng point trên bình ðồ. Bạn có thể vào mục viết lisp theo yêu cầu ðể nhờ anh em giúp ðỡ
  • 0
Hình đã gửi

#5 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 27 November 2008 - 11:10 AM

Để trực quan hơn, mình gửi file mẫu để tham khảo, file1 trước khi dùng lisp, file2 sau khi dùng lisp. cám ơn bạn đã quan tâm
http://www.cadviet.c...Drawing1_18.dwg
http://www.cadviet.c.../Drawing2_7.dwg

Bạn dùng thử LISP sau :
(defun c:ins_point (/ ss i ent point curLayer)
(if (setq ss (ssget (list (cons 0 "TEXT"))))
(progn
(setq i 0
curLayer (getvar "clayer"))
(if (not (tblsearch "layer" "points"))
(command "-layer" "n" "points" "c" "1" "points" "") ) ; tao layer Point
(setvar "clayer" "points") ; Set layer Current
(repeat (sslength ss)
(setq ent (ssname ss i)
point (cdr (assoc 10 (entget ent)))
i (1+ i)
)
(entmake (list (cons 0 "POINT") (cons 10 point)))
)
(setvar "clayer" curLayer)
)
)
(princ)
)

  • 2

#6 vbao

vbao

    biết lệnh array

  • CADViet Team
  • PipPipPip
  • 184 Bài viết
Điểm đánh giá: 80 (tàm tạm)

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

Bạn dùng thử LISP sau :

(defun c:ins_point (/ ss i ent point curLayer)
(if (setq ss (ssget (list (cons 0 "TEXT"))))
(progn
(setq i 0
curLayer (getvar "clayer"))
(if (not (tblsearch "layer" "points"))
(command "-layer" "n" "points" "c" "1" "points" "") ) ; tao layer Point
(setvar "clayer" "points") ; Set layer Current
(repeat (sslength ss)
(setq ent (ssname ss i)
point (cdr (assoc 10 (entget ent)))
i (1+ i)
)
(entmake (list (cons 0 "POINT") (cons 10 point)))
)
(setvar "clayer" curLayer)
)
)
(princ)
)


gia_bach có thể viết thêm đối tượng POINT vừa tạo, nếu cần theo yêu cầu của người sử dụng thì ghi thêm vào POINT có tọa độ z=giá trị của text trong tiện ích trên được không? Thanks
  • 0

#7 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 27 November 2008 - 03:15 PM

gia_bach có thể viết thêm đối tượng POINT vừa tạo, nếu cần theo yêu cầu của người sử dụng thì ghi thêm vào POINT có tọa độ z=giá trị của text trong tiện ích trên được không? Thanks

Bạn dùng thử LISP sau :
(chú ý: Lisp này chưa xét đến t.hợp nội dung Text không phải là số. Vd: " 123 0" có khoảng trắng giữa các kí tự)
(defun c:ins_point (/ ss i ent point curLayer)
(if (setq ss (ssget (list (cons 0 "TEXT"))))
(progn
(setq i 0
curLayer (getvar "clayer"))
(if (not (tblsearch "layer" "points"))
(command "-layer" "n" "points" "c" "1" "points" "") ) ; tao layer Point
(setvar "clayer" "points") ; Set layer Current
(repeat (sslength ss)
(setq ent (ssname ss i)
point (cdr (assoc 10 (entget ent)))
txt (atof(cdr (assoc 1 (entget ent))))
p (list (car point)(cadr point) txt)
i (1+ i)
)
(entmake (list (cons 0 "POINT") (cons 10 p)))
)
(setvar "clayer" curLayer)
)
)
(princ)
)

  • 0

#8 betong8x

betong8x

    biết pan

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

Đã gửi 07 September 2010 - 10:37 AM

bạn đã chèn cao độ vào điểm node chứ ko phải là điểm insertion
muốn chèn vào điểm insertion thì có lisp nào ko bạn
  • 0

#9 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 07 September 2010 - 12:32 PM

bạn đã chèn cao độ vào điểm node chứ ko phải là điểm insertion
muốn chèn vào điểm insertion thì có lisp nào ko bạn

Update theo yêu cầu.
Lisp chèn Point vào điểm insertion của Text (nếu có), t/hợp Text không có điểm insertion chèn Point vào điểm Node.
(chú ý: Lisp này chưa xét đến t.hợp nội dung Text không phải là số. Vd: " 123 0" có khoảng trắng giữa các kí tự)
(defun c:ins_point (/ curlayer edata i pt ss txt)
(if (setq ss (ssget (list (cons 0 "TEXT"))))
(progn
(setq i 0
curLayer (getvar "clayer"))
(if (not (tblsearch "layer" "points"))
(command "-layer" "n" "points" "c" "1" "points" "") )
(setvar "clayer" "points")
(repeat (sslength ss)
(setq edata (entget(ssname ss i))
pt (if (equal (setq pt (cdr (assoc 11 edata))) '(0 0 0))
(cdr (assoc 10 edata))
pt)
txt (atof(cdr (assoc 1 edata)))
pt (list (car pt)(cadr pt) txt)
i (1+ i) )
(entmake (list (cons 0 "POINT") (cons 10 pt))) )
(setvar "clayer" curLayer) ) )
(princ))

  • 0

#10 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 07 September 2010 - 02:26 PM

Update theo yêu cầu.
Lisp chèn Point vào điểm insertion của Text (nếu có), t/hợp Text không có điểm insertion chèn Point vào điểm Node.
(chú ý: Lisp này chưa xét đến t.hợp nội dung Text không phải là số. Vd: " 123 0" có khoảng trắng giữa các kí tự)

(defun c:ins_point (/ curlayer edata i pt ss txt)
(if (setq ss (ssget (list (cons 0 "TEXT"))))
(progn
(setq i 0
curLayer (getvar "clayer"))
(if (not (tblsearch "layer" "points"))
(command "-layer" "n" "points" "c" "1" "points" "") )
(setvar "clayer" "points")
(repeat (sslength ss)
(setq edata (entget(ssname ss i))
pt (if (equal (setq pt (cdr (assoc 11 edata))) '(0 0 0))
(cdr (assoc 10 edata))
pt)
txt (atof(cdr (assoc 1 edata)))
pt (list (car pt)(cadr pt) txt)
i (1+ i) )
(entmake (list (cons 0 "POINT") (cons 10 pt))) )
(setvar "clayer" curLayer) ) )
(princ))

Lisp của bạn
(setq pt (if (equal (setq pt (cdr (assoc 11 edata))) '(0 0 0)) (cdr (assoc 10 edata)) pt))
ngắn hơn 1 chút so với lisp
(setq pt (cdr (assoc (if (< 0 (+ (cdr (assoc 72 edata)) (cdr (assoc 73 edata)))) 11 10) edata)))
nhưng sẽ sai trong trường hợp text có điểm chèn tại '(0 0 0) mặc dù xác suất xảy ra trong thực tế =0
  • 0