Đến nội dung


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

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)


  • Please log in to reply
2854 replies to this topic

#161 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

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

Đã gửi 06 January 2009 - 04:19 PM

Các bác ơi cho em hỏi 1 tí.
1- Em muốn viết lisp để Lock tất cả Layer, em đã viết thử theo suy nghĩ nhưng lisp bị lỗi, mong các bác chỉ giáo.

(DEFUN C:LL ( )
(COMMAND "UNDO" "BE")
(SETQ LUUBATDIEM (GETVAR "OSMODE"))
(SETVAR "OSMODE" 0)
(SETQ TAPLAYER (SSGET '((0 . "LAYER"))))
(SETQ I 0)
(SETQ N (SSLENGTH TAPLAYER))
(WHILE (< I N)
(SETQ TENLAYER (SSNAME TAPLAYER I))
(COMMAND "LAYER" "LO" TENLAYER "")
(SETQ I (+ I 1))
)
(SETVAR "OSMODE" LUUBATDIEM)
(COMMAND "UNDO" "END")
(PRINC)
)

2- Nếu muốn tác động đến thằng Global Scale factor thì mình dùng biến hệ thống gì hay phải làm như thế nào?

http://www.cadviet.c...les/Book1_3.xls

Em cảm ơn mấy bác nhiều lắm.
  • 0

#162 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 06 January 2009 - 04:55 PM

2- Nếu muốn tác động đến thằng Global Scale factor thì mình dùng biến hệ thống gì hay phải làm như thế nào?

http://www.cadviet.c...les/Book1_3.xls

Em cảm ơn mấy bác nhiều lắm.

Muốn tác động đến thằng Global Scale factor thì mình dùng biến LTSCALE (LTS).
Còn muốn tác động đến thằng Current Object Scale : cái thằng đứng dưới Global Scale factor đó thì dùng biến CELTSCALE
  • 0

#163 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 06 January 2009 - 05:04 PM

Các bác ơi cho em hỏi 1 tí.
1- Em muốn viết lisp để Lock tất cả Layer, em đã viết thử theo suy nghĩ nhưng lisp bị lỗi, mong các bác chỉ giáo.

(DEFUN C:LL ( )
(COMMAND "UNDO" "BE")
(SETQ LUUBATDIEM (GETVAR "OSMODE"))
(SETVAR "OSMODE" 0)
(SETQ TAPLAYER (SSGET '((0 . "LAYER"))))
(SETQ I 0)
(SETQ N (SSLENGTH TAPLAYER))
(WHILE (< I N)
(SETQ TENLAYER (SSNAME TAPLAYER I))
(COMMAND "LAYER" "LO" TENLAYER "")
(SETQ I (+ I 1))
)
(SETVAR "OSMODE" LUUBATDIEM)
(COMMAND "UNDO" "END")
(PRINC)
)

2- Nếu muốn tác động đến thằng Global Scale factor thì mình dùng biến hệ thống gì hay phải làm như thế nào?

http://www.cadviet.c...les/Book1_3.xls

Em cảm ơn mấy bác nhiều lắm.

1. Lisp lock (LL) và unlock (UL) all layer:

;;;-------------------------------------------------------
(defun GetLay(/ Lay Laylist)
(setq Lay (tblnext "LAYER" T) Laylist nil)
(While Lay (setq Laylist (append Laylist (list (cdr (assoc 2 Lay)))) Lay (tblnext "LAYER")))
(acad_strlsort Laylist)
)
;;;-------------------------------------------------------
(defun C:LL() (foreach lay (getlay) (command "layer" "LO" lay "")))
;;;-------------------------------------------------------
(defun C:UL() (foreach lay (getlay) (command "layer" "U" lay "")))
;;;-------------------------------------------------------


2. (setvar "LTSCALE" value)

Góp ý thêm:
1. Dòng code tô đỏ ở trên là một sai lầm nghiêm trọng!
2. Khi chỉ tác động đến layer, các dòng code về osmode là không cần thiết (vì nó chẳng liên quan gì)
3. Bạn kiếm 1 cuốn sách lisp, cố gắng làm các bài tập cơ bản theo sách, đừng nóng vội!
  • 0

#164 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

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

Đã gửi 06 January 2009 - 05:10 PM

Cám ơn bạn Tue_NV và bác SSQ nhiều lắm.
Do em cũng mới bắt đầu học thôi nên cũng không hiểu sâu lắm.
Sau này nhờ các bác giúp đỡ thêm.
Ngày mai em sẽ thử nghiệm liền.
Chúc các bác luôn vui vẻ.
  • 0

#165 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

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

Đã gửi 12 January 2009 - 09:05 AM

Nhờ các bác giúp em gán lệnh While vào lisp này với.

(defun c:thu()
(setq kieu (getstring "\nNhap kieu cat: "))
(setq dt (car (entsel "\nChon doi tuong: ")))
(setq diem (getpoint "\nChon diem: "))
(setq pt1(list (+ (car diem) 100) (+ (cadr diem) 0) 0))
(setq pt2(list (- (car diem) 100) (+ (cadr diem) 0) 0))
(setq pt3(list (+ (car diem) 0) (+ (cadr diem) 100) 0))
(setq pt4(list (+ (car diem) 0) (- (cadr diem) 100) 0))
(if (= kieu "x")
(progn
(command ".break" dt pt1 pt2)
)
)
(if (= kieu "y")
(progn
(command ".break" dt pt3 pt4)
)
)
)
(princ)

Em xin giải thích đôi chút, kiểu cắt X là cắt theo phương X, kiểu cắt Y là cắt theo phương Y. Do đó kiểu cắt X thì chọn đối tượng cũng theo phương X, Y cũng vậy.
Ở đây em muốn dùng hàm While để sau khi lisp break xong 1 đối tượng rồi sẽ quay lại lúc chọn điểm " (setq diem (getpoint "\nChon diem: ")) " để làm việc tiếp.
Và nếu lisp này có điểm nào không hay nhờ các bác chỉnh dùm.

Cám ơn các bác nhiều lắm.
  • 0

#166 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 12 January 2009 - 11:28 AM

Nhờ các bác giúp em gán lệnh While vào lisp này với.

(defun c:thu()
.........................
)

Em xin giải thích đôi chút, kiểu cắt X là cắt theo phương X, kiểu cắt Y là cắt theo phương Y. Do đó kiểu cắt X thì chọn đối tượng cũng theo phương X, Y cũng vậy.
Ở đây em muốn dùng hàm While để sau khi lisp break xong 1 đối tượng rồi sẽ quay lại lúc chọn điểm " (setq diem (getpoint "\nChon diem: ")) " để làm việc tiếp.
.............

Bạn dùng thử LISP này xem đúng ý bạn không nhé?
(defun c:thu(/ dt pt1 pt2)
(setq kieu (strcase(getstring "\nNhap kieu cat: ")))
(while (and (/= kieu "X") (/= kieu "Y"))
(alert "Chi chap nhan kieu = x,X,y,Y !")
(setq kieu (strcase(getstring "\nNhap kieu cat: ")))
)
(setq osn (getvar "osmode"))

(while (setq dt (car (entsel "\nChon doi tuong: ")))
(redraw dt 3)
(setvar "osmode" 32);giao diem
(setq diem (getpoint "\nChon diem: "))
(if (= kieu "X")
(setq pt1(list (+ (car diem) 100) (+ (cadr diem) 0) 0)
pt2(list (- (car diem) 100) (+ (cadr diem) 0) 0))
)
(if (= kieu "Y")
(setq pt1(list (+ (car diem) 0) (+ (cadr diem) 100) 0)
pt2(list (+ (car diem) 0) (- (cadr diem) 100) 0))
)
(setvar "osmode" 0)
(command ".break" dt pt1 pt2)
(redraw dt 4)
)
(setvar "osmode" osn)
(princ)
)


Chú ý :
1.Sau khi lisp break xong đối tượng rồi, bạn phải chọn lại đối tượng rồi chọn điểm.

kiểu cắt X là cắt theo phương X, kiểu cắt Y là cắt theo phương Y. Do đó kiểu cắt X thì chọn đối tượng cũng theo phương X, Y cũng vậy.
.............

2.Bạn thử chọn ngược lại, VD: với kiểu cắt là X -> chọn đối tượng theo phương Y -> nhận xét kết quả.
  • 0

#167 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

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

Đã gửi 12 January 2009 - 01:29 PM

Bạn dùng thử LISP này xem đúng ý bạn không nhé?

(defun c:thu(/ dt pt1 pt2)
(setq kieu (strcase(getstring "\nNhap kieu cat: ")))
(while (and (/= kieu "X") (/= kieu "Y"))
(alert "Chi chap nhan kieu = x,X,y,Y !")
(setq kieu (strcase(getstring "\nNhap kieu cat: ")))
)
(setq osn (getvar "osmode"))

(while (setq dt (car (entsel "\nChon doi tuong: ")))
(redraw dt 3)
(setvar "osmode" 32);giao diem
(setq diem (getpoint "\nChon diem: "))
(if (= kieu "X")
(setq pt1(list (+ (car diem) 100) (+ (cadr diem) 0) 0)
pt2(list (- (car diem) 100) (+ (cadr diem) 0) 0))
)
(if (= kieu "Y")
(setq pt1(list (+ (car diem) 0) (+ (cadr diem) 100) 0)
pt2(list (+ (car diem) 0) (- (cadr diem) 100) 0))
)
(setvar "osmode" 0)
(command ".break" dt pt1 pt2)
(redraw dt 4)
)
(setvar "osmode" osn)
(princ)
)


Chú ý :
1.Sau khi lisp break xong đối tượng rồi, bạn phải chọn lại đối tượng rồi chọn điểm.

2.Bạn thử chọn ngược lại, VD: với kiểu cắt là X -> chọn đối tượng theo phương Y -> nhận xét kết quả.



Chào bác Gia bach
Cái lisp này đúng ý của em rồi, cám ơn bác nhiều lắm.
Bác hỏi em câu " Bạn thử chọn ngược lại, VD: với kiểu cắt là X -> chọn đối tượng theo phương Y -> nhận xét kết quả " thì kết quả là lisp chỉ break đối tượng thôi chứ không cắt đi 1 đoạn nào hết. Ý của bác là chỉ muốn break thôi hay bác muốn nói điều gì vậy.
Còn 1 vấn đề này nữa, khi lisp thực hiện vòng While thì chế độ bắt điểm bị mất hết, bác sửa lại dùm em tí với.
  • 0

#168 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 12 January 2009 - 02:05 PM

Chào bác Gia bach

Còn 1 vấn đề này nữa, khi lisp thực hiện vòng While thì chế độ bắt điểm bị mất hết, bác sửa lại dùm em tí với.

Tại vì trong vòng lặp While của bạn có dòng lệnh (setvar "osmode" 0) nên nó tắt chế độ bắt điểm đi thôi.
Nếu muốn sửa bạn chỉ cần xách nó bỏ ra ngoài hoặc xách thằng (setvar "osmode" osn) vào trong vòng lặp while sau khi thực hiện lệnh break.
Chúc bạn thành công.
TB: Mà sao đăng ký offline rồi trốn mất tiêu vậy, mình đợi quá trời luôn.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#169 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 12 January 2009 - 03:16 PM

.........
Bạn thử chọn ngược lại, VD: với kiểu cắt là X -> chọn đối tượng theo phương Y -> nhận xét kết quả " thì kết quả là lisp chỉ break đối tượng thôi chứ không cắt đi 1 đoạn nào hết.

Chỉ là phát hiện tình cờ khi chạy thử đoạn code trên, không có ý gì cả.

....
khi lisp thực hiện vòng While thì chế độ bắt điểm bị mất hết, bác sửa lại dùm em tí với.

Đã sửa lổi chế độ bắt điểm. (chế độ bắt điểm trong vòng lặp hơi bị rắc rối.)
(defun c:thu(/ dt pt1 pt2)
(Save_Mode) (Init)
(setq kieu (strcase(getstring "\nNhap kieu cat: ")))
(while (and (/= kieu "X") (/= kieu "Y"))
(alert "Chi chap nhan kieu = x,X,y,Y !")
(setq kieu (strcase(getstring "\nNhap kieu cat: ")))
)
(while (setq dt (car (entsel "\nChon doi tuong: ")))
(redraw dt 3)
(setvar "osmode" 32);giao diem
(setq diem (getpoint "\nChon diem: "))
(if (= kieu "X")
(setq pt1(list (+ (car diem) 100) (+ (cadr diem) 0) 0)
pt2(list (- (car diem) 100) (+ (cadr diem) 0) 0))
;(= kieu "Y")
(setq pt1(list (+ (car diem) 0) (+ (cadr diem) 100) 0)
pt2(list (+ (car diem) 0) (- (cadr diem) 100) 0))
)
(setvar "osmode" 0)
(command ".break" dt pt1 pt2)
)
(Done) (Restore) (princ)
)

(defun Save_Mode ()
(setq OSM (getvar "osmode"))
)
;;;--------- Bay loi ------------------
(defun Init ()
(setq OldEr *error*
*error* MyError
)
)
;;;--------- Xu ly loi ------------------
(defun MyError (errmsg)
(cond
((= errmsg "quit / exit abort")
(princ)
)
((/= errmsg "Function cancelled")
(princ (strcat "\n Co loi: " errmsg))
)
)
(Done)
(if dt (redraw dt 4))
(Restore)
)

(defun Done ()
(if OldEr (setq *error* OldEr ) )
)

(defun Restore ()
(if OSM (setvar "osmode" OSM ) )
)


  • 0

#170 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

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

Đã gửi 12 January 2009 - 04:28 PM

@Phamthanhbinh : Sáng hôm qua có phone cho anh Sơn báo bận vì phải dọn nhà, để đi tăng 2 mà có lẽ tăng 1 kết thúc trễ quá ( hình như là 15h mấy thì phải ) nên ở nhà ngủ quên mất , anh Sơn có phone nhưng không hay. Thôi hẹn dịp sau ha.
@Giabach : thank bác nhiều nha.
  • 0

#171 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

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

Đã gửi 15 January 2009 - 08:30 AM

Nhờ các bác xem dùm em cái lisp kẻ khung cho text này không dùng được khi mình dùng kiểu gõ tiếng Nhật, vậy có cách khắc phục nào không. Các bác xem file đính kèm sẽ thấy mẫu OK nằm ở bên kiểu gõ tiếng Anh.

http://www.cadviet.c...Drawing1_27.dwg
http://www.cadviet.c...files/new_5.lsp

Mong các bác giúp đỡ, cảm ơn.
  • 0

#172 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 15 January 2009 - 09:23 AM

......
lisp kẻ khung cho text này không dùng được khi mình dùng kiểu gõ tiếng Nhật,
...........


Có lẽ ý bạn là : Khi chạy LISP cho Text có font tiếng Nhật thì kết quả cho không như mong muốn.(k/cách là 100,50 ...)
Thực ra kết quả vẫn cho ra đúng, do hàm TextBox trả về giá trị so với đường viền bao quanh TEXT chứ không phải so với điểm chèn (base point) như trong bản vẽ của bạn.

Vấn đề điểm chèn do FONT chữ quyết định (được setting trong TextStyle), chứ không phụ thuộc vào kiểu gõ.
Khi thiết kế FONT (không chỉ font tiếng Nhật), họ quyết định điểm chèn (base point) sẽ được đặt ở đâu.
(tương tự như khi tạo Block trong CAD, user cũng phải chỉ ra base point.)

Nếu bạn muốn vẽ đường viền theo điểm chèn, bạn cần phải biết rõ về Font chữ mình sử dụng.
Thân.
  • 0

#173 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 15 January 2009 - 10:18 AM

Nhờ các bác xem dùm em cái lisp kẻ khung cho text này không dùng được khi mình dùng kiểu gõ tiếng Nhật, vậy có cách khắc phục nào không. Các bác xem file đính kèm sẽ thấy mẫu OK nằm ở bên kiểu gõ tiếng Anh.

http://www.cadviet.c...Drawing1_27.dwg
http://www.cadviet.c...files/new_5.lsp

Mong các bác giúp đỡ, cảm ơn.

Nếu tất cả fonts tiếng Nhật điều bị lệch kích thước như vậy thì các thủ công nhất là chỉnh các số trong lisp để ra kết quả ưng ý.
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#174 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

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

Đã gửi 15 January 2009 - 03:56 PM

Cám ơn bác duy và bác gia bach nhiều lắm.
Để khắc phục tình huống này em có ý tưởng sau để làm lisp kẻ khung mới nhưng chưa biết cách lấy tọa độ điểm mà mình muốn, nhờ các bác có thể hướng dẫn phương pháp dùm.

http://www.cadviet.c...Drawing1_28.dwg

Xin cảm ơn.
  • 0

#175 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 15 January 2009 - 04:10 PM

Cám ơn bác duy và bác gia bach nhiều lắm.
Để khắc phục tình huống này em có ý tưởng sau để làm lisp kẻ khung mới nhưng chưa biết cách lấy tọa độ điểm mà mình muốn, nhờ các bác có thể hướng dẫn phương pháp dùm.

http://www.cadviet.c...Drawing1_28.dwg

Xin cảm ơn.

Hình như bạn chưa hiểu bài viết của giabach thì phải.
Cái bạn muốn làm mình không hiểu cách tư duy của bạn.
Chỉ cần sửa dòng này là xong mà!
(command "rectangle" (list (- (car ul) 100) (+ (cadr ul) 50)) (list (+ (car lr) 100) (- (cadr lr) 50)))
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#176 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

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

Đã gửi 16 January 2009 - 08:12 AM

Hình như bạn chưa hiểu bài viết của giabach thì phải.
Cái bạn muốn làm mình không hiểu cách tư duy của bạn.
Chỉ cần sửa dòng này là xong mà!
(command "rectangle" (list (- (car ul) 100) (+ (cadr ul) 50)) (list (+ (car lr) 100) (- (cadr lr) 50)))



Chào anh Duy.
Em đã sửa như dòng dưới mà không hiểu sao khoảng cách 50 100 thì đúng còn tổng khoảng cách 350 thì không đúng, nó lại ra 366.
(command "rectangle" (list (- (car ul) (+ 100 27)) (+ (cadr ul) (+ 50 33))) (list (+ (car lr) (+ 100 27)) (- (cadr lr) (+ 50 33))))
http://www.cadviet.c...Drawing1_29.dwg
  • 0

#177 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 06 February 2009 - 06:19 PM

Chào anh Duy.
Em đã sửa như dòng dưới mà không hiểu sao khoảng cách 50 100 thì đúng còn tổng khoảng cách 350 thì không đúng, nó lại ra 366.
(command "rectangle" (list (- (car ul) (+ 100 27)) (+ (cadr ul) (+ 50 33))) (list (+ (car lr) (+ 100 27)) (- (cadr lr) (+ 50 33))))
http://www.cadviet.c...Drawing1_29.dwg

Chào bạn Tuan_thietkedien,
Hôm nay mình mới đọc bài pót của bạn. Về cơ bản mình thấy ý kiến của bác Giabach là hoàn toàn đúng. Việc bạn chỉnh lại lisp như vậy thực ra mới chỉ là chỉnh lại kích thước của khung theo kích thước truy xuất của hàm textbox chứ chưa phải theo tọa độ điểm chèn text. Rất có thể do người viết font tiếng Anh và người viết font tiếng Nhật có quan điểm khác nhau khi chọn điểm chèn text nên nó xảy ra tình trạng như vậy.
Bạn lưu ý kỹ trên bản vẽ của bạn sẽ thấy các kích thước từ điểm giới hạn text được truy xuất bởi hàm textbox trong hai trường hợp này có khác nhau do việc chọn điểm chèn text của người viết font.
Do vậy nếu bạn muốn vẽ khung bao text đúng với kích thước mà bạn dự định thì bạn phải test đối với từng loại font mà bạn sử dụng chứ không thể chỉ 1 lisp mà giải quyết cho tất cả các font được.
Về lisp của bạn, theo mình thì không cần thiết phải sử dụng các biến u1 và 1r vì tất cả các tọa độ bạn cần sử dụng đều đã có sẵn từ biến 1l và ur rồi. Bạn chỉ cần lưu ý chọn đúng nó ở trong hàm vẽ khung Rectangle là được.
Còn về con số 366 nó là đương nhiên vì trước khi bạn chỉnh lisp nó đã là 300, sau khi chỉnh bạn thêm vào cả trên và dưới là 33 thì phải ra 366 chứ chạy vào đâu được. Nếu bạn muốn nó đúng 350 thì cái kích thước 50 của bạn sẽ chỉ còn 42 là do sự khác nhau về điểm chèn text của người viết font.
Mình cũng không biết cách nào để có thể làm đúng hết như ý bạn được vì chả biết cái ý của người viết font này ra sao cả. Bạn hãy tự chọn cho mình cái gì là thuận lợi nhất.
Chúc bạn vui và thành công.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#178 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

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

Đã gửi 09 February 2009 - 11:50 AM

Chào bạn Tuan_thietkedien,
Hôm nay mình mới đọc bài pót của bạn. Về cơ bản mình thấy ý kiến của bác Giabach là hoàn toàn đúng. Việc bạn chỉnh lại lisp như vậy thực ra mới chỉ là chỉnh lại kích thước của khung theo kích thước truy xuất của hàm textbox chứ chưa phải theo tọa độ điểm chèn text. Rất có thể do người viết font tiếng Anh và người viết font tiếng Nhật có quan điểm khác nhau khi chọn điểm chèn text nên nó xảy ra tình trạng như vậy.
Bạn lưu ý kỹ trên bản vẽ của bạn sẽ thấy các kích thước từ điểm giới hạn text được truy xuất bởi hàm textbox trong hai trường hợp này có khác nhau do việc chọn điểm chèn text của người viết font.
Do vậy nếu bạn muốn vẽ khung bao text đúng với kích thước mà bạn dự định thì bạn phải test đối với từng loại font mà bạn sử dụng chứ không thể chỉ 1 lisp mà giải quyết cho tất cả các font được.
Về lisp của bạn, theo mình thì không cần thiết phải sử dụng các biến u1 và 1r vì tất cả các tọa độ bạn cần sử dụng đều đã có sẵn từ biến 1l và ur rồi. Bạn chỉ cần lưu ý chọn đúng nó ở trong hàm vẽ khung Rectangle là được.
Còn về con số 366 nó là đương nhiên vì trước khi bạn chỉnh lisp nó đã là 300, sau khi chỉnh bạn thêm vào cả trên và dưới là 33 thì phải ra 366 chứ chạy vào đâu được. Nếu bạn muốn nó đúng 350 thì cái kích thước 50 của bạn sẽ chỉ còn 42 là do sự khác nhau về điểm chèn text của người viết font.
Mình cũng không biết cách nào để có thể làm đúng hết như ý bạn được vì chả biết cái ý của người viết font này ra sao cả. Bạn hãy tự chọn cho mình cái gì là thuận lợi nhất.
Chúc bạn vui và thành công.


Cám ơn thanhbinh đã góp ý nha. :cheers:
  • 0

#179 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

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

Đã gửi 09 February 2009 - 01:01 PM

Chào mọi người.

Các bác cho em hỏi 2 vấn đề

1 - Cái lisp giãn dòng text với kích thước là 500 này chạy không như ý muốn, xin các bác góp ý dùm

http://www.cadviet.c...Drawing1_31.dwg

http://www.cadviet.c...files/new_2.lsp

2 - Khi muốn lấy điểm chèn block có thể sử dụng đoạn code sau hay không?
(setq dt (ensel))
(setq diemchen (cdr (assoc 10 dt)))

Cám ơn các bác nhiều lắm.
  • 0

#180 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 09 February 2009 - 03:46 PM

2 - Khi muốn lấy điểm chèn block có thể sử dụng đoạn code sau hay không?
(setq dt (ensel))
(setq diemchen (cdr (assoc 10 dt)))

Cám ơn các bác nhiều lắm.

Oài :cheers:
- Hàm entsel cho ra kết quả là (ename, điểm ta pick chuột). không tin bạn có thể đánh ngay dòng lệnh (entsel) ngay ngoài command thì bít. Đây là cái bạn hiểu sai về bản chất.
-Nó ra kết quả không hề có dạng(ename (10 x y z)) mà chỉ là (ename (x y z)). cho nên bạn dùng hàm (assoc 10 dt) là vô ích . Cái này bạn hiểu sai về cấu trúc dữ liệu được cho ra bởi hàm entsel.
=> sửa lại cho đúng là:
(setq dt (ensel))
(setq diemchen (cdr (assoc 10 (entget (car dt))))

Giải thích:
(car dt)->lấy ename của đối tượng pick
(entget (car dt ))-> lấy cấu trúc dữ liệu của ename . Điểm chèn sẽ có dạng (10 x y z)
(cdr (assoc 10 (entget (car dt))))-> lấy ra tọa độ (x y z) từ (10 x y z)
Mịn chưa :cheers:
  • 2