Chuyển đến nội dung
Diễn đàn CADViet
quansla

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

Các bài được khuyến nghị

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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é!

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

(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

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

(car nil) = error = (entget error) = (caddr(assoc 10 error)) = Real - error = Crash a ơi

=> If ở dòng 4 thừa

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

(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

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

À 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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

À 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ì

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×