Đế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

#81 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 12 September 2009 - 12:45 PM

Đây là lisp em đã viết lại theo gợi ý của anh Tuệ
Lisp sẽ đưa ra yêu cầu
- nhập số muốn nhân. (nếu không có thì enter bỏ qua)
- nhập số muốn chia. (nếu không có thì enter bỏ qua. em tách số muốn nhân và số muốn chia thành 2 số độc lập để đỡ fải nhẩm giá trị nghịch đảo của một số nào đó khi thực muốn hiện phép chia)
- nhập số muốn cộng (nếu không có thì enter bỏ qua. nếu muốn thực hiện phép trừ thay cho phép cộng thì chỉ cần nhập giá trị âm)
- chọn các text số cần thay đổi giá trị. --> OK

(defun c:tinh()
(setq i 0 nhan 1 chia 1 cong 0)
(setq nhan1 (getreal "\nnhap so muon nhan: ")
chia1 (getreal "\nnhap so muon chia: ")
cong1 (getreal "\nnhap so muon cong them: "))
(if nhan1 (setq nhan nhan1))
(if chia1 (setq chia chia1))
(if cong1 (setq cong cong1))
(prompt "\nchon cac so can sua ...")
(setq txt (ssget '((0 . "TEXT"))))
(repeat (sslength txt)
(setq txt_name (ssname txt i))
(setq txt_ent (entget txt_name))
(setq cont1 (cdr(assoc 1 txt_ent)))
(setq cont (atof cont1))
(if (and (/= cont1 "0") (/= cont1 "0.0") (/= cont1 "0.00") (/= cont1 "0.000") (/= cont1 "0.0000") (/= cont1 "0.0000") (/= cont1 "00.0") (/= cont1 "00.00") (/= cont1 "00.000") (/= cont1 "00.0000") (/= cont1 "00.0000") (= cont 0)) ()
(progn
(setq s (+ (/ (* cont nhan) chia) cong))
(setq txt_ent (subst (cons 1 (rtos s)) (assoc 1 txt_ent) txt_ent))
(entmod txt_ent)))
(setq i (+ i 1))
);repeat
);defun
Quả thật sau khi hoàn thiện lisp này mới thấy ý tưởng của anh Tuệ rất hay, rất thông minh. cảm ơn anh đã góp ý để em hoàn thiện code này. :s_big:

Đoạn code này em có bổ xung thêm phần lọc đối tượng text là số và chuỗi ký tự. cách làm hơi củ chuối tý nhưng em nghĩ nó hoạt động tương đối hiệu quả rồi. hiện tại em cũng chưa nghĩ ra cách nào tốt hơn giúp lọc đối tượng text thành số và chuỗi ký tự riêng biệt.
cách làm này có nhược điểm:
- bị giới hạn nhận diện các số có giá trị bằng 0 (ngoài các số có giá trị là 0 đã đưa vào lisp như trên thì các số 0 dạng khác nó sẽ hiểu thành chuỗi ký tự. VD số 0.0 thì nó nhận diện được, còn số 000.00000 nó hiểu là chuỗi ký tự "000.00000" và ko thực hiện phép tính cho số này)
- còn bị nhầm lẫn một chỗi ký tự thành một số nếu các kỹ tự đầu chuỗi là số. VD chỗi 23ABCD thì nó sẽ hiểu thành 23.
tuy nhiên những trường hợp trên là rất ít gặp và có thể khắc phục trong qúa trình sử dụng. Hi vọng anh Tuệ mọi người có cách khác hay hơn.

Vấn đề tách các loại chuỗi bằng lisp quả thật là vấn đề nan giải, cho nên theo mình nghĩ để có thể sử dụng tốt lisp này nên đưa tất cả các text số cần chuyển đổi về một lớp tạm thời nào đó, sau đó dùng hàm ssget với tham số x và bộ lọc mang tên lớp này.
Sau khi thực hiện xong các bước chuyển đổi sẽ trả các đối tượng về lớp cũ của nó và xóa lớp tạm thời đi.
Cách này có bất lợi là nếu như các text số nằm trên quá nhiều lớp thì việc lưu giữ tên các lớp này sẽ khá rắc rối.
Đó là cái ngu ý của mình, mong các bác góp thêm ý kiến nha.
  • 2
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#82 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 12 September 2009 - 02:28 PM

Vấn đề tách các loại chuỗi bằng lisp quả thật là vấn đề nan giải, cho nên theo mình nghĩ để có thể sử dụng tốt lisp này nên đưa tất cả các text số cần chuyển đổi về một lớp tạm thời nào đó, sau đó dùng hàm ssget với tham số x và bộ lọc mang tên lớp này.
Sau khi thực hiện xong các bước chuyển đổi sẽ trả các đối tượng về lớp cũ của nó và xóa lớp tạm thời đi.
Cách này có bất lợi là nếu như các text số nằm trên quá nhiều lớp thì việc lưu giữ tên các lớp này sẽ khá rắc rối.
Đó là cái ngu ý của mình, mong các bác góp thêm ý kiến nha.

Chào bạn PhamThanhBinh và bạn Thaistreet
Bạn có thể xem thêm vấn đề này tại đây :
Viết Lisp theo yêu cầu - Bài viết số 2741

Bài viết của anh gia bách :
Chọn Text là số

và bài viết này nữa :
Phân biệt Text

@Thaistreet : Tue_NV đã viết bài trả lời bạn ở trang trước. Hy vọng bạn xây dựng Code thành công :s_big:

@ thiep : Rất cảm ơn bạn đã Reply. Mình hoàn toàn đồng ý với bạn.
  • 4

#83 Tuynh

Tuynh

    biết vẽ arc

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

Đã gửi 12 September 2009 - 02:33 PM

Chào bạn Tuynh
Quả thật là mình không biết lệnh "tạo nhà" trong nova là lệnh nào. Phải chăng bạn muốn nói đến các loại địa vật vẽ trên trắc ngang? nếu không fải thì bạn cho mình tên lệnh và tên bản nova bạn đang dùng để mình kiểm tra nhé. nếu giúp được mình sẵn lòng.

Mình đưa hai file lên đây bạn xem thì hiểu ngay thôi.
http://www.cadviet.c...2/tao_nha_1.rar
http://www.cadviet.c...files/2/nha.dwg
  • 0

#84 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 12 September 2009 - 03:41 PM

Chào bạn PhamThanhBinh và bạn Thaistreet
Bạn có thể xem thêm vấn đề này tại đây :
Viết Lisp theo yêu cầu - Bài viết số 2741
Bài viết của anh gia bách :
Chọn Text là số
và bài viết này nữa :
Phân biệt Text

@Thaistreet : Tue_NV đã viết bài trả lời bạn ở trang trước. Hy vọng bạn xây dựng Code thành công :cheers:

Đúng rồi. chỉ cân nhập số muốn chia dưới dạng 1/X là ok, vậy mà em không nghĩ ra.
cảm ơn anh đã thông tin cho em về hàm distof. có nó thì vấn đề lọc text theo số và chuỗi ký tự đã đc giải quyết một cách đơn giản.
code em đã sửa lại đây ạ. Em nghĩ thế này là nó đã hoàn thiện. :s_big:
(defun c:tinh()
(setq i 0 nhan 1 chia 1 cong 0)
(setq nhan1 (getreal (strcat "\n nhap so muon nhan hoac chia <" (rtos nhan 2 3) ">: "))
cong1 (getreal (strcat "\n nhap so muon cong hoac tru <" (rtos cong 2 3) ">:")))
(if nhan1 (setq nhan nhan1))
(if cong1 (setq cong cong1))
(prompt "\nchon cac so can sua ...")
(setq txt (ssget '((0 . "TEXT"))))
(command "undo" "begin")
(repeat (sslength txt)
(setq txt_name (ssname txt i))
(setq txt_ent (entget txt_name))
(setq cont1 (cdr(assoc 1 txt_ent)))
(setq cont (atof cont1))
(if (distof cont1 2)
(progn
(setq s (+ (* cont nhan) cong))
(setq txt_ent (subst (cons 1 (rtos s)) (assoc 1 txt_ent) txt_ent))
(entmod txt_ent));if
);if
(setq i (+ i 1))
);repeat
(command "undo" "end")
);defun
@ bác Thanh Bình: hic, bác ơi, bác đừng gọi em là "bác Thaistreetz" nhé, tổn thọ em mất. Em mới ra trường chưa lâu và so với các bác ở đây chắc cũng chỉ được coi là "tụi trẻ" thôi bác ạ. :s_big:
  • 1

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#85 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 12 September 2009 - 04:13 PM

Mình đưa hai file lên đây bạn xem thì hiểu ngay thôi.
http://www.cadviet.c...2/tao_nha_1.rar
http://www.cadviet.c...files/2/nha.dwg

Mình ít phải vẽ bình đồ vì hầu hết các công trình mình làm đều có thể xin được bình đồ bên địa chính nên đúng là mình chưa sử dung lệnh này bao giờ cả.
Để vẽ cái này trên cad bằng lisp thì cũng khá đơn giản, mình có thể làm đc (tất nhiên sẽ không cần quá nhiều nhiều tùy chọn và ko có chế độ preview như Hài Hòa đã làm vì trình độ của mình chưa đủ để làm việc đó).
Mình sẽ đơn giản hóa nó thế này.
- Lisp sẽ vẽ 2 loại nhà (có lựa chọn cho bạn khi bắt đâu vẽ mỗi ngôi nhà): nhà mái ngói (giống yêu cầu của bạn) và nhà tầng với số tầng bạn nhập vào
- Text ghi số tầng của nhà tầng sẽ luôn nằm ngang (góc xoay của text là 0) theo trục tọa độ của bạn trong bản vẽ, chiều cao text bạn phải nhập vào ngay lúc bắt đầu chạy lệnh.
Ok chứ?
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#86 Tuynh

Tuynh

    biết vẽ arc

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

Đã gửi 12 September 2009 - 08:28 PM

- Lisp sẽ vẽ 2 loại nhà (có lựa chọn cho bạn khi bắt đâu vẽ mỗi ngôi nhà): nhà mái ngói (giống yêu cầu của bạn) và nhà tầng với số tầng bạn nhập vào
- Text ghi số tầng của nhà tầng sẽ luôn nằm ngang (góc xoay của text là 0) theo trục tọa độ của bạn trong bản vẽ, chiều cao text bạn phải nhập vào ngay lúc bắt đầu chạy lệnh.
Ok chứ?
[/quote]
Ok bạn viết đi mình đang chờ bạn.
  • 0

#87 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 13 September 2009 - 03:53 PM

Đây là lisp vẽ nhà dùng để vẽ bình đồ theo cách vẽ của lệnh NHA trong NOVA nhưng đã được đơn giản hóa.
- khi vẽ chỉ cân pick vào 3 điểm góc của nhà.
- Lisp vẽ được 2 loại nhà: nhà ngói (hay nhà lá) và nhà tầng với số tầng nhập vào khi vẽ.
- Với nhà ngói, các đường thể hiện mái ngói được vẽ riêng bằng một layer khác.
- toàn bộ nhà được vẽ bằng layer NHATOANDAC
Hình đã gửi

(Defun c:nha ( )
(if (not h) (setq h 1))
(setq h1 (getreal (strcat "\nCao text <"(rtos h 2 2)">:")))
(if h1 (setq h h1))
(setq laylast (getvar "clayer"))
(setq oslast (getvar "osmode"))
(setq colast (getvar "cecolor"))
(command "osmode" 109)
(setq pta (getpoint (strcat "\n pick diem thu nhat")))
(setq i1 0 i2 0)

(while (/= pta nil)
(command "undo" "begin")
(command "color" 1 "circle" pta 1)
(setq ss1 (ssget "L") ss (ssadd) ss (ssadd (ssname ss1 0) ss))
(setvar "cecolor" colast)
(setq ptb (getpoint (strcat "\n pick diem thu 2") pta))
(command "color" 2 "circle" ptb 1)
(setq ss2 (ssget "L") ss (ssadd (ssname ss2 0) ss))
(setvar "cecolor" colast)
(setq ptc (getpoint (strcat "\n pick diem thu 3") ptb))
(command "color" 3 "circle" ptc 1)
(setq ss3 (ssget "L") ss (ssadd (ssname ss3 0) ss))
(setvar "cecolor" colast)
(setq L1 (distance pta ptb) L2 (distance ptb ptc))
(setq ptd (polar pta (angle ptb ptc) L2))
(if (> L2 L1)
(setq pt1 pta pt2 ptb pt3 ptc)
(setq pt1 ptd pt2 pta pt3 ptb))
(setq L1 (distance pt1 pt2) L2 (distance pt2 pt3))
(setq goc1 (angle pt1 pt2))
(setq goc2 (angle pt2 pt3))
(setq pt4 (polar pt1 goc2 L2))
(setq pt5 (polar pt1 (- goc1 (/ pi 6)) (/ L1 2 (cos (/ pi 6)))))
(setq pt6 (polar pt3 (+ goc2 (/ pi 3)) (/ L1 -2 (cos (/ pi 6)))))
(setq pt7 (polar pt5 goc2 (/ (distance pt5 pt6) 2)))

(setq nha (cond (nha) ("Ngoi")))
(initget "Ngoi Tang")
(setq Tmp1 (strcat "\nNha mai ngoi hay nha tang [Ngoi/Tang] <" nha ">: ")
nha (cond ((getkword Tmp1)) (nha)))
(if (not (tblsearch "layer" "NHATOANDAC"))
(command "-layer" "N" "NHATOANDAC" "S" "NHATOANDAC" "color" 7 "" "")
(command "Clayer" "NHATOANDAC"))

(if (eq Nha "Ngoi")
(progn
(Command "color" bylayer "osmode" 0 "pline" pt1 pt2 pt3 pt4 pt1 "")
(if (not (tblsearch "layer" "layer1"))
(command "-layer" "N" "layer1" "S" "layer1" "color" 8 "" "")
(command "Clayer" "layer1"));if
(command "pline" pt1 pt5 pt2 "")
(command "pline" pt5 pt6 "")
(command "pline" pt3 pt6 pt4 "")
(command "osmode" 109)
(setq i1 (1+ i1))
(setvar "cecolor" colast)
(command "erase" ss "")
(command "undo" "end")
);progn
(progn
(setq tang (cond (tang) ("2tang")))
(initget "2tang 3tang 4tang 5tang 6tang")
(setq Tmp1 (strcat "\nNha bao nhieu tang [2Tang/3Tang/4Tang/5Tang/6Tang]<" tang ">: ")
tang (cond ((getkword Tmp1)) (tang)))
(Command "color" bylayer "osmode" 0 "pline" pt1 pt2 pt3 pt4 pt1"")
(if (eq tang "2tang") (command "color" 3 "text" "m" pt7 h 0 "2T"))
(if (eq tang "3tang") (command "color" 3 "text" "m" pt7 h 0 "3T"))
(if (eq tang "4tang") (command "color" 3 "text" "m" pt7 h 0 "4T"))
(if (eq tang "5tang") (command "color" 3 "text" "m" pt7 h 0 "5T"))
(if (eq tang "6tang") (command "color" 3 "text" "m" pt7 h 0 "6T"))
(setq i2 (1+ i2))
(command "osmode" 109)
(setvar "cecolor" colast)
(command "erase" ss "")
(command "undo" "end")
);progn
);if
(setq pta (getpoint (strcat "\n pick diem thu nhat")))
);while
(setvar "cecolor" colast)
(setvar "osmode" oslast)
(setvar "clayer" laylast)
(command "undo" "end")
(prompt (strcat "\nDa ve " (rtos i1 2 0) " nha ngoi va " (rtos i2 2 0) " nha tang\n"))
(prompt "\nby Thaistreetz - huuthais@yahoo.com\n")
);end.

Chú ý: Khi pick các điểm góc nhà ngói bạn bắt buộc phải pick lần lượt 3 góc theo chiều quay kim đồng hồ. Mình phát hiện lỗi này sau khi đã viết xong lisp nên ngại viết lại. bạn sử dụng chú ý một chút là ok thôi.
  • 2

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#88 Tuynh

Tuynh

    biết vẽ arc

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

Đã gửi 13 September 2009 - 08:48 PM

Đây là lisp vẽ nhà dùng để vẽ bình đồ theo cách vẽ của lệnh NHA trong NOVA nhưng đã được đơn giản hóa.
- khi vẽ chỉ cân pick vào 3 điểm góc của nhà.
- Lisp vẽ được 2 loại nhà: nhà ngói (hay nhà lá) và nhà tầng với số tầng nhập vào khi vẽ.
- Với nhà ngói, các đường thể hiện mái ngói được vẽ riêng bằng một layer khác.
- toàn bộ nhà được vẽ bằng layer NHATOANDAC
Hình đã gửi


(Defun c:nha ( )
(if (not h) (setq h 1))
(setq h1 (getreal (strcat "\nCao text <"(rtos h 2 2)">:")))
(if h1 (setq h h1))
(setq laylast (getvar "clayer"))
(setq oslast (getvar "osmode"))
(setq colast (getvar "cecolor"))
(command "osmode" 109)
(setq pta (getpoint (strcat "\n pick diem thu nhat")))
(setq i1 0 i2 0)

(while (/= pta nil)
(command "undo" "begin")
(command "color" 1 "circle" pta 1)
(setq ss1 (ssget "L") ss (ssadd) ss (ssadd (ssname ss1 0) ss))
(setvar "cecolor" colast)
(setq ptb (getpoint (strcat "\n pick diem thu 2") pta))
(command "color" 2 "circle" ptb 1)
(setq ss2 (ssget "L") ss (ssadd (ssname ss2 0) ss))
(setvar "cecolor" colast)
(setq ptc (getpoint (strcat "\n pick diem thu 3") ptb))
(command "color" 3 "circle" ptc 1)
(setq ss3 (ssget "L") ss (ssadd (ssname ss3 0) ss))
(setvar "cecolor" colast)
(setq L1 (distance pta ptb) L2 (distance ptb ptc))
(setq ptd (polar pta (angle ptb ptc) L2))
(if (> L2 L1)
(setq pt1 pta pt2 ptb pt3 ptc)
(setq pt1 ptd pt2 pta pt3 ptb))
(setq L1 (distance pt1 pt2) L2 (distance pt2 pt3))
(setq goc1 (angle pt1 pt2))
(setq goc2 (angle pt2 pt3))
(setq pt4 (polar pt1 goc2 L2))
(setq pt5 (polar pt1 (- goc1 (/ pi 6)) (/ L1 2 (cos (/ pi 6)))))
(setq pt6 (polar pt3 (+ goc2 (/ pi 3)) (/ L1 -2 (cos (/ pi 6)))))
(setq pt7 (polar pt5 goc2 (/ (distance pt5 pt6) 2)))

(setq nha (cond (nha) ("Ngoi")))
(initget "Ngoi Tang")
(setq Tmp1 (strcat "\nNha mai ngoi hay nha tang [Ngoi/Tang] <" nha ">: ")
nha (cond ((getkword Tmp1)) (nha)))
(if (not (tblsearch "layer" "NHATOANDAC"))
(command "-layer" "N" "NHATOANDAC" "S" "NHATOANDAC" "color" 7 "" "")
(command "Clayer" "NHATOANDAC"))

(if (eq Nha "Ngoi")
(progn
(Command "color" bylayer "osmode" 0 "pline" pt1 pt2 pt3 pt4 pt1 "")
(if (not (tblsearch "layer" "layer1"))
(command "-layer" "N" "layer1" "S" "layer1" "color" 8 "" "")
(command "Clayer" "layer1"));if
(command "pline" pt1 pt5 pt2 "")
(command "pline" pt5 pt6 "")
(command "pline" pt3 pt6 pt4 "")
(command "osmode" 109)
(setq i1 (1+ i1))
(setvar "cecolor" colast)
(command "erase" ss "")
(command "undo" "end")
);progn
(progn
(setq tang (cond (tang) ("2tang")))
(initget "2tang 3tang 4tang 5tang 6tang")
(setq Tmp1 (strcat "\nNha bao nhieu tang [2Tang/3Tang/4Tang/5Tang/6Tang]<" tang ">: ")
tang (cond ((getkword Tmp1)) (tang)))
(Command "color" bylayer "osmode" 0 "pline" pt1 pt2 pt3 pt4 pt1"")
(if (eq tang "2tang") (command "color" 3 "text" "m" pt7 h 0 "2T"))
(if (eq tang "3tang") (command "color" 3 "text" "m" pt7 h 0 "3T"))
(if (eq tang "4tang") (command "color" 3 "text" "m" pt7 h 0 "4T"))
(if (eq tang "5tang") (command "color" 3 "text" "m" pt7 h 0 "5T"))
(if (eq tang "6tang") (command "color" 3 "text" "m" pt7 h 0 "6T"))
(setq i2 (1+ i2))
(command "osmode" 109)
(setvar "cecolor" colast)
(command "erase" ss "")
(command "undo" "end")
);progn
);if
(setq pta (getpoint (strcat "\n pick diem thu nhat")))
);while
(setvar "cecolor" colast)
(setvar "osmode" oslast)
(setvar "clayer" laylast)
(command "undo" "end")
(prompt (strcat "\nDa ve " (rtos i1 2 0) " nha ngoi va " (rtos i2 2 0) " nha tang\n"))
(prompt "\nby Thaistreetz - huuthais@yahoo.com\n")
);end.

Chú ý: Khi pick các điểm góc nhà ngói bạn bắt buộc phải pick lần lượt 3 góc theo chiều quay kim đồng hồ. Mình phát hiện lỗi này sau khi đã viết xong lisp nên ngại viết lại. bạn sử dụng chú ý một chút là ok thôi.

Cảm ơn bạn lisp chạy rất hay, mình nhờ bạn chút nữa được không, mình muốn góc nói như nào nhỉ, để mình gửi file lên nhé, giúp tớ một chút nữa nhé. Mình cũng thử chỉnh lại lisp nhưng mãi không được. Cám ơn bạn trước nhé.
http://www.cadviet.c...es/2/nha25d.dwg
  • 0

#89 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 13 September 2009 - 10:18 PM

Cảm ơn bạn lisp chạy rất hay, mình nhờ bạn chút nữa được không, mình muốn góc nói như nào nhỉ, để mình gửi file lên nhé, giúp tớ một chút nữa nhé. Mình cũng thử chỉnh lại lisp nhưng mãi không được. Cám ơn bạn trước nhé.
http://www.cadviet.c...es/2/nha25d.dwg

File bản vẽ trước bạn up lên cho mình xem là 30 đô. chính xác là 29 độ chứ không fải 25 độ

Góc 25 độ = pi/7.2 rad
bạn sửa 2 dòng này:
(setq pt5 (polar pt1 (- goc1 (/ pi 6)) (/ L1 2 (cos (/ pi 6)))))
(setq pt6 (polar pt3 (+ goc2 (/ pi 3)) (/ L1 -2 (cos (/ pi 6)))))

thành:
(setq pt5 (polar pt1 (- goc1 (/ pi 7.2)) (/ L1 2 (cos (/ pi 7.2)))))
(setq pt6 (polar pt3 (+ goc2 (/ pi 2.769)) (/ L1 -2 (cos (/ pi 7.2)))))

Chúc bạn thành công.
  • 1

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#90 Tuynh

Tuynh

    biết vẽ arc

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

Đã gửi 13 September 2009 - 11:49 PM

File bản vẽ trước bạn up lên cho mình xem là 30 đô. chính xác là 29 độ chứ không fải 25 độ

Góc 25 độ = pi/7.2 rad
bạn sửa 2 dòng này:
(setq pt5 (polar pt1 (- goc1 (/ pi 6)) (/ L1 2 (cos (/ pi 6)))))
(setq pt6 (polar pt3 (+ goc2 (/ pi 3)) (/ L1 -2 (cos (/ pi 6)))))

thành:
(setq pt5 (polar pt1 (- goc1 (/ pi 7.2)) (/ L1 2 (cos (/ pi 7.2)))))
(setq pt6 (polar pt3 (+ goc2 (/ pi 2.769)) (/ L1 -2 (cos (/ pi 7.2)))))

Chúc bạn thành công.

Uh bản vẽ trước là phần mềm tự tạo, mình thấy không đẹp lắm lên mới thay đổi như thế thôi, giờ thì tớ hiểu rồi cậu giải thích như này thì tớ có thể cho một góc theo ý muốn rồi. cám ơn bạn.
Chúc Thaistreetz sức khỏe, thành công trong cuộc sống nhé.
  • 1

#91 kamezoko

kamezoko

    biết vẽ line

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

Đã gửi 14 September 2009 - 03:36 PM

cám ơn TUE,Thiep nhiều lắm.. :cheers:
tại bản vẻ của tôi thì diểm chèn nằm dưới góc trái của text... :s_big:
chúc các bạn nhiều sức khỏe va thành công.. :s_big:
  • 0

#92 dovanlinh

dovanlinh

    biết vẽ arc

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

Đã gửi 15 September 2009 - 09:51 AM

Giúp em với, sao em tạo cái vòng lặp mà không được nhỉ?
(defun c:x1 ( / tx1 tx2 p1 p2 p3)
(setq p1 (getpoint "\nBase point"))
(setq p2 (getpoint "\nBase second point"))
(prompt "\nSelect base text:")
(setq tx1 (ssget))
(while (setq tx2 (entsel "\nSelect next text:"))
(setq P3 (cdr(assoc 10 (entget(car tx2)))))
(command "matchprop" tx1 tx2 "")
(command "copy" tx2 "" p3 p2 "")
(setq p2 (polar p2 -90 400))
)
)

  • 0
49XD1

#93 nataca

nataca

    biết lệnh adcenter

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

Đã gửi 15 September 2009 - 10:30 AM

Giúp em với, sao em tạo cái vòng lặp mà không được nhỉ?

(defun c:x1 ( / tx1 tx2 p1 p2 p3)
(setq p1 (getpoint "\nBase point"))
(setq p2 (getpoint "\nBase second point"))
(prompt "\nSelect base text:")
(setq tx1 (ssget))
(while (setq tx2 (entsel "\nSelect next text:"))
(setq P3 (cdr(assoc 10 (entget(car tx2)))))
(command "matchprop" tx1 tx2 "")
(command "copy" tx2 "" p3 p2 "")
(setq p2 (polar p2 -90 400))
)
)

Chưa hiểu mục đích viết lisp này của bạn là để làm việc gì?
  • 0

#94 khaosat2009

khaosat2009

    biết lệnh offset

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

Đã gửi 15 September 2009 - 12:57 PM

Nhờ bạn giúp cho việc chình các điểm vẽ nhà tạo thành các góc vuông.
và khi vẽ nhà có nhiều cạnh như chữ L

  • 0

#95 dovanlinh

dovanlinh

    biết vẽ arc

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

Đã gửi 15 September 2009 - 03:36 PM

Chưa hiểu mục đích viết lisp này của bạn là để làm việc gì?

mình muốn tạo lisp để khi mình chọn một đối tượng text thì nó tự động copy text đó, sau đó chuyển nó vể dạng của text cơ bản và sắp xếp thành một bảng. nhìn chung mục đính chính là tạo ra một bảng thống kê bản vẽ bằng việc chọn tên của các bản vẽ.
Cho mình hỏi thêm, viết lisp thế nảo để chuyển justin của text từ cẻnter về left nhỉ?
  • 0
49XD1

#96 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 15 September 2009 - 03:42 PM

Giúp em với, sao em tạo cái vòng lặp mà không được nhỉ?

Chắc bạn ấy đang viết dở anh nataca ạ :s_big:
Điều kiện lặp của bạn là tx2 khác nil. như code của bạn thì nó thoát khỏi vòng lặp ngay sau lần lặp đầu tiên là đúng rồi.
bạn thêm dòng (setq tx2 (entsel "\nSelect next text:")) ngay trước khi đóng while là được.
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#97 nataca

nataca

    biết lệnh adcenter

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

Đã gửi 16 September 2009 - 12:06 AM

mình muốn tạo lisp để khi mình chọn một đối tượng text thì nó tự động copy text đó, sau đó chuyển nó vể dạng của text cơ bản và sắp xếp thành một bảng. nhìn chung mục đính chính là tạo ra một bảng thống kê bản vẽ bằng việc chọn tên của các bản vẽ.
Cho mình hỏi thêm, viết lisp thế nảo để chuyển justin của text từ cẻnter về left nhỉ?

- Đoạn Lisp của bạn không sai về thuật toán. Có chăng là sai về góc trong hàm Polar (góc này phải là radian. Như vậy bạn phải thay -90 bằng -pi/2)
- Justify của Text được quy định bởi mã DXF 72 và 73. 72 là canh lề theo phương ngang, 73 là canh lề theo phương đứng. Nếu bạn muốn chuyển từ Center về Left thì bạn cho mã DXF 72 từ 1 về 0 {tức là thay (72 . 1) thành (72 . 0) }
  • 0

#98 Snowman

Snowman

    biết lệnh mirror

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

Đã gửi 16 September 2009 - 12:52 AM

Để căn lề cho text, ngoài việc chỉnh mã Dfx 72, 73 còn fải chú ý đến 2 mã 10 và 11 (điểm chèn và điểm canh lề - hình như vậy). Với các text căn lề mặc định (72 . 0) (73 . 0) thì ko cần quan tâm tới mã 11 . Nhưng nếu chỉnh sửa 2 mã 72, 73 # 0 mà ko chỉnh lại mã 11 thì text sẽ bị ...bay về gốc 0. Cho nên fải thêm đoạn gán mã 11 bằng (x, y, z) mong muốn
Tham khảo đoạn hàm tạo text tùy ý dưới đây:
(defun txt_make	(contxt	   ins_po    cur_la    cur_st	 h_txt
ro-txt wf-txt code-72 code-73 /
ent_lst cur_cl htxt aglpo
)
(if (not (tblsearch "STYLE" cur_st))
(setq cur_st (getvar "TEXTSTYLE"))
)
(if (not (tblsearch "Layer" cur_la))
(setq cur_la (getvar "CLAYER"))
)

(setq ent_lst (append '((0 . "TEXT"))
(list (cons 8 cur_la)
(cons 40 h_txt)
(cons 41 wf-txt)
(cons 7 cur_st)
(cons 50 ro-txt)
(cons 1 contxt)
(cons 10 ins_po)
)
)
)
(if (entmake ent_lst)
(setq ent-txt (entlast)
ent-lst (entget ent-txt)
ent-lst (subst (cons 72 code-72) (assoc 72 ent-lst) ent-lst)
ent-lst (subst (cons 73 code-73) (assoc 73 ent-lst) ent-lst)
ent-lst (subst (cons 11 ins_po) (assoc 11 ent-lst) ent-lst)

ent-txt (entmod ent-lst)
)
)

)


(Chú Natasa dạo này cũng thức khuya nhỉ, lại "trăn trở" chuyện vợ con ah?)
  • 0

. - ' * ' - .. - ... "Sống trong đời sống cần có một tấm lòng..." . - ' * ' - .. -
-----------------------------------------------------------------------------------

Hình đã gửi Hình đã gửi


#99 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 16 September 2009 - 05:12 AM

Để căn lề cho text, ngoài việc chỉnh mã Dfx 72, 73 còn fải chú ý đến 2 mã 10 và 11 (điểm chèn và điểm canh lề - hình như vậy). Với các text căn lề mặc định (72 . 0) (73 . 0) thì ko cần quan tâm tới mã 11 . Nhưng nếu chỉnh sửa 2 mã 72, 73 # 0 mà ko chỉnh lại mã 11 thì text sẽ bị ...bay về gốc 0. Cho nên fải thêm đoạn gán mã 11 bằng (x, y, z) mong muốn

Vừa hay em mới viết xong cái lisp căn lề text. Em giải quyết vấn đề này bằng cách lấy toàn bộ các thuộc tính của text được chọn, xóa text đó đi rồi viết lại text khác tại vị trí mới với nội dung và thuộc tính (Value, style, layer, color, hight text) giống hệt text cũ.
Bạn dovanlinh có thể tham khảo thêm tại đây
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#100 kamezoko

kamezoko

    biết vẽ line

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

Đã gửi 16 September 2009 - 11:04 PM

Chào kamezoko và thiep
Lisp sau Tue_NV đã viết theo ý kamezoko nhưng chưa hoàn thành.
và mình post lên để giúp cho kamezoko.
Lisp trên nối điiẻm chèn Text lại với nhau theo ý của kamezoko.
Vì Lisp trên chưa hoàn hảo nên muốn thoát bạn bấm Esc 2 lần để thoát lệnh nhé.
Bạn xài tạm vậy :

(defun c:ntdt(/ lis a ss i ent chu p x)
(setvar "cmdecho" 0)
(prompt "Chon Text :")
(setq ss (ssget '((0 . "TEXT"))) i 0 lis nil res " " lisch "")
(while (< i (sslength ss))
(setq ent (entget(ssname ss i)))
(setq chu (cdr(assoc 1 ent)))
(setq p (cdr(assoc 10 ent)))
(setq lis (append lis (list (cons chu p))))
(setq lisch (strcat lisch chu res))
(setq i (1+ i))
)

(command "line")
(foreach x lis
(initget 1 (eval lisch))
(command
(if (setq a (assoc (getkword "\n Nhap chu : ") lis))
(progn
(cdr a)
)
)
)
)

(princ)
)
Nếu thiep và mọi người rảnh thì xin sửa dùm Code này lại với vì hiện giờ Tue_NV rất bận. Thanks

nhờ các anh sửa lisp này dùm em,lisp chạy tốt nhưng khi kết thúc thì nó ko nhớ các diểm đã chọn..hic..mất công chọn điểm lại khi thực hiện lệnh....mong các anh giúp đở thêm..em cám ơn :s_big: :cheers:
  • 0