Đến nội dung


Hình ảnh
- - - - -

[Nhờ sửa list] list thêm dòng text vào dưới Text2


  • Please log in to reply
11 replies to this topic

#1 quansla

quansla

    biết lệnh xclip

  • Members
  • PipPipPipPipPipPipPip
  • 643 Bài viết
Điểm đánh giá: 224 (khá)

Đã gửi 19 September 2012 - 06:47 PM

Em mới viết xong list này, dự định là khi cần thêm vào một dòng Text thẳng cột với dòng các dòng Text trên(cụ thể là dòng Text khi chọn ở (entsel"\nText2 ") trong list)
Ưu điểm của list là có thể thêm chính xác Text nhập vào, và có khoảng cách như 2 Text nhập ban đầu
Nhược điểm là:
Không dừng được list(hix, em dùng hàm (while) với điều kiện là còn nhập vào Text thì còn chèn vào nhưng hàm getstring với tham số T thì chỉ còn cách ESC mới thoát lệnh được)
Không nhập được trực tiếp Text mà phải gõ trên Command(cái này thì không khó chịu lắm nhưng em mún tìm hiểu để dùng cho các list sau này
Vậy em gửi list này nhờ các cao thủ xem giúp em, sửa list, thêm thắt để em khắc phục được nhược điểm của list ạ. Em cảm ơn
List của em đây ạ

(defun c:xyz (/ delta k e2 str p1 p2 oldos)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq delta (- (caddr(assoc 10 (entget(car(entsel"\nText1 ")))))
(if(setq e2(entget(car(entsel"\nText2 "))))
(caddr(assoc 10 e2)))))
(setq k 1)
(while (setq str (getstring T (strcat"Nhap Text chen: " (rtos k))))
(setq p1(cdr(assoc 10 e2)))
(setq p2(list (car p1) (- (cadr p1) (* k delta)) 0))
(vtext2 str p2 "Text")
(setq k (1+ k))
)
(setq k nil)
(setvar "osmode" oldos)
(princ)
)



(defun vText2(str p layer )
(entmake
(list
'(0 . "TEXT")
'(100 . "AcDbEntity")
'(100 . "AcDbText")
(cons 1 str);string
(cons 7 (getvar "textstyle"));style
(cons 8 layer);layer
(cons 62 256);color
(cons 10 p);insertion point
(cons 11 p);alignment point
(cons 40 250);text height - change by suit
(cons 41 1.0);text width
(cons 50 0.0);1.5708 - vertical, 0.0 - horizontal
(cons 51 0.0);oblique angle
'(71 . 0);alignment
'(72 . 0);alignment
'(73 . 0);alignment
)
)
(princ)
)

  • 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 19 September 2012 - 07:15 PM

Em mới viết xong list này, dự định là khi cần thêm vào một dòng Text thẳng cột với dòng các dòng Text trên(cụ thể là dòng Text khi chọn ở (entsel"\nText2 ") trong list)
Ưu điểm của list là có thể thêm chính xác Text nhập vào, và có khoảng cách như 2 Text nhập ban đầu
Nhược điểm là:
Không dừng được list(hix, em dùng hàm (while) với điều kiện là còn nhập vào Text thì còn chèn vào nhưng hàm getstring với tham số T thì chỉ còn cách ESC mới thoát lệnh được)
Không nhập được trực tiếp Text mà phải gõ trên Command(cái này thì không khó chịu lắm nhưng em mún tìm hiểu để dùng cho các list sau này
Vậy em gửi list này nhờ các cao thủ xem giúp em, sửa list, thêm thắt để em khắc phục được nhược điểm của list ạ. Em cảm ơn
List của em đây ạ


(defun c:xyz (/ delta k e2 str p1 p2 oldos)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq delta (- (caddr(assoc 10 (entget(car(entsel"\nText1 ")))))
(if(setq e2(entget(car(entsel"\nText2 "))))
(caddr(assoc 10 e2)))))
(setq k 1)
(while (setq str (getstring T (strcat"Nhap Text chen: " (rtos k))))
(setq p1(cdr(assoc 10 e2)))
(setq p2(list (car p1) (- (cadr p1) (* k delta)) 0))
(vtext2 str p2 "Text")
(setq k (1+ k))
)
(setq k nil)
(setvar "osmode" oldos)
(princ)
)



(defun vText2(str p layer )
(entmake
(list
'(0 . "TEXT")
'(100 . "AcDbEntity")
'(100 . "AcDbText")
(cons 1 str);string
(cons 7 (getvar "textstyle"));style
(cons 8 layer);layer
(cons 62 256);color
(cons 10 p);insertion point
(cons 11 p);alignment point
(cons 40 250);text height - change by suit
(cons 41 1.0);text width
(cons 50 0.0);1.5708 - vertical, 0.0 - horizontal
(cons 51 0.0);oblique angle
'(71 . 0);alignment
'(72 . 0);alignment
'(73 . 0);alignment
)
)
(princ)
)

Muốn thoát khỏi vòng lặp thì bạn dùng điều kiện logic này ở hàm while:
(and (setq str (getstring T (strcat"Nhap Text chen: " (rtos k)))) (/= str ""))
Enter là thoát khỏi vòng lặp

Dòng màu đỏ trên : Bạn nói rõ yêu cầu của bạn rõ hơn nhé!
  • 1

#3 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5449 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 19 September 2012 - 07:18 PM

(while (/= "" (setq str (getstring T (strcat"Nhap Text chen: " (rtos k)))))
  • 2

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#4 quansla

quansla

    biết lệnh xclip

  • Members
  • PipPipPipPipPipPipPip
  • 643 Bài viết
Điểm đánh giá: 224 (khá)

Đã gửi 19 September 2012 - 07:39 PM

Muốn thoát khỏi vòng lặp thì bạn dùng điều kiện logic này ở hàm while:
(and (setq str (getstring T (strcat"Nhap Text chen: " (rtos k)))) (/= str ""))
Enter là thoát khỏi vòng lặp

Dòng màu đỏ trên : Bạn nói rõ yêu cầu của bạn rõ hơn nhé!

Aha ra là vậy cảm ơn bác, có lần nhìn kiểu này rồi mà không nhớ ra hì hì, xin lỗi bác ý em là thế này:
Dòng màu đỏ trên : Em mong muốn là khi nhập Text với list thì sẽ nhâp và sửa như khi mình dùng lệnh :DText vậy, còn nếu dùng hàm getstring thì bắt buộc nhập Text cho biến "str" trong list là nhập trên màn hình(tức là giống với khi dùng lệnh "LINE" không nhấp chuột mà gõ chữ "sfsakljf ksjdlafj jasljf" ý ạ, nhìn nó không trực quan
  • 1

#5 quansla

quansla

    biết lệnh xclip

  • Members
  • PipPipPipPipPipPipPip
  • 643 Bài viết
Điểm đánh giá: 224 (khá)

Đã gửi 19 September 2012 - 07:42 PM

(while (/= "" (setq str (getstring T (strcat"Nhap Text chen: " (rtos k)))))

Hì cảm ơn bác, xét ra thì cách viết của bác gọn hơn của bác Tue_NV
  • 1

#6 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 19 September 2012 - 09:19 PM

Aha ra là vậy cảm ơn bác, có lần nhìn kiểu này rồi mà không nhớ ra hì hì, xin lỗi bác ý em là thế này:
Dòng màu đỏ trên : Em mong muốn là khi nhập Text với list thì sẽ nhâp và sửa như khi mình dùng lệnh :DText vậy, còn nếu dùng hàm getstring thì bắt buộc nhập Text cho biến "str" trong list là nhập trên màn hình(tức là giống với khi dùng lệnh "LINE" không nhấp chuột mà gõ chữ "sfsakljf ksjdlafj jasljf" ý ạ, nhìn nó không trực quan

Cái này dùng Dtext : hơi bị chua
Chi bằng bật Dynmode lên (set vô trong Lsp) luôn
(setvar "dynmode" 1)
Là nhìn trực quan liền à

Đề nghị bạn viết đúng chính tả nhé! LISP chứ không phải list
  • 1

#7 quansla

quansla

    biết lệnh xclip

  • Members
  • PipPipPipPipPipPipPip
  • 643 Bài viết
Điểm đánh giá: 224 (khá)

Đã gửi 19 September 2012 - 10:12 PM

Cái này dùng Dtext : hơi bị chua
Chi bằng bật Dynmode lên (set vô trong Lsp) luôn
(setvar "dynmode" 1)
Là nhìn trực quan liền à

Đề nghị bạn viết đúng chính tả nhé! LISP chứ không phải list

Hì thanks bác, hồi đầu nghĩ ra ý tưởng thêm Text này em dùng lệnh Copy Text2 rồi (command "edit"...) luôn, về sau thấy bất tiện quá nên viết lisp này ạ. Hix bác nói em mới để ý, từ xưa đến nay em toàn viết list , ngu quá, một lần nữa cảm ơn bác hihihi
  • 1

#8 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 20 September 2012 - 03:47 AM

Hì thanks bác, hồi đầu nghĩ ra ý tưởng thêm Text này em dùng lệnh Copy Text2 rồi (command "edit"...) luôn, về sau thấy bất tiện quá nên viết lisp này ạ. Hix bác nói em mới để ý, từ xưa đến nay em toàn viết list , ngu quá, một lần nữa cảm ơn bác hihihi

Vậy bạn sử dụng Lisp này xem thử ưng bụng không nhé!

(defun c:xyz (/ delta k e2 str p1 p2 oldos)
(setvar "cmdecho" 0)
(setq delta (- (caddr(assoc 10 (entget(car(entsel"\nText1 ")))))
(if(setq e2(entget (setq ent2 (car(entsel"\nText2 ")))))
(caddr(assoc 10 e2)))))
(setq k 1 str "Tue_NV")
(setq p1(cdr(assoc 10 e2)))
(while (/= str "")
(princ (strcat "\nNhap Text chen: " (rtos k 2 0) " : " ))
(setq p2(list (car p1) (- (cadr p1) (* k delta)) 0))
(Command "copy" ent2 "" "_non" p1 "_non" p2) (setq el (entget (entlast)))
(entmod (subst(cons 1 " ") (assoc 1 el) el))
(command "ddedit" "L" "")
(setq str (vl-string-trim " " (cdr(assoc 1 (entget (entlast))))))
(setq k (1+ k))(princ str)
)
(princ)
)
Bạn không thích nhập nữa thì để 1 chuỗi trắng và enter -> Kết thúc là xong
  • 2

#9 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 20 September 2012 - 07:16 AM

(car nil) = error = (entget error) = (caddr(assoc 10 error)) = Real - error = Crash a ơi
=> If ở dòng 4 thừa
  • 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


#10 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 20 September 2012 - 07:32 AM

(car nil) = error = (entget error) = (caddr(assoc 10 error)) = Real - error = Crash a ơi
=> If ở dòng 4 thừa

Ket nhận xét dùm cho bạn quansla rồi đấy thôi.
Mình chỉ lo sửa phần ở dưới thôi. Phần trên để bạn ấy .... tự xử
Mà mình thấy bạn ấy viết trong trường hợp pick trúng object Text chứ ko tính đến TH (car nil)

Cái Lisp này giống thời hồi xưa mình làm ấy nhỉ? "1" enter "2" enter "3" enter :D
  • 1

#11 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 20 September 2012 - 08:26 AM

À hóa ra nguyên bản của chủ topic ^^
@ quansla : mới tập viết mà sử dụng hàm con tốt thì sẽ sớm ngon lành thôi ^^
Theo mình, nếu được, bạn nên
- Thử chuyển thao tác pick Text1, text 2 thành thao tác quét chọn tập text
- Nếu toàn bộ là Dtext : lấy 2 thằng dưới cùng làm cơ sở, sẽ nhanh và ưng hơn nhiều đấy
- Có 1 Mtext dưới cùng : thì edit xuống dòng
=> Có 1 lệnh continue text hoàn thiện hơn
  • 0

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


#12 quansla

quansla

    biết lệnh xclip

  • Members
  • PipPipPipPipPipPipPip
  • 643 Bài viết
Điểm đánh giá: 224 (khá)

Đã gửi 23 September 2012 - 11:42 PM

À hóa ra nguyên bản của chủ topic ^^
@ quansla : mới tập viết mà sử dụng hàm con tốt thì sẽ sớm ngon lành thôi ^^
Theo mình, nếu được, bạn nên
- Thử chuyển thao tác pick Text1, text 2 thành thao tác quét chọn tập text
- Nếu toàn bộ là Dtext : lấy 2 thằng dưới cùng làm cơ sở, sẽ nhanh và ưng hơn nhiều đấy
- Có 1 Mtext dưới cùng : thì edit xuống dòng
=> Có 1 lệnh continue text hoàn thiện hơn

Cám ơn các bác đã quan tâm, hôm nay thu được nhiều kinh nghiệm quá hì hì
  • 0