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

#2121 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 05 October 2010 - 09:10 AM

Dùng lệnh scale thì 2 đầu nó không còn giữ được nữa bác ơi.E lại ngồi trim :|

PS : Liệu có cách nào giãn 2 đường biên ra thì các đường thẳng vuông góc với các đường này tại đỉnh line tự stretch ra theo (như associate sim ấy ạ) k các bác nhỉ.Làm thế để không phải trim lại chỗ giao với đài móng nữa(1 công việc khá boring :cheers: )

Chào bạn ketxu,
Hề hề hề,
Trên diễn đàn có lisp scale theo một chiều mà, có cả lisp scale theo hai chiều với các tỷ lệ khác nhau nũa cơ mà. Bạn ngâm cứu thử coi. Có khi lại quá đạt yêu cầu thì gay......
Cái PS của bạn có thể làm được nếu bạn ngâm cứu kỹ cái lisp vẽ tường của bác Phamngoctukts ,( cái đoạn trim các đầu mút đó) và ứng dụng vào trường hợp của bạn. Cụ thể là dùng lệnh trim với tùy biến fence bạn ạ.

Chúc bạn thành công, nếu có trở ngại hãy post lên nhé.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2122 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 05 October 2010 - 09:56 AM

Chào bạn hd4151,
Bạn dùng thử cái này coi sao.
Điều kiện là các điểm phải được tạo trước và có độ lệch so với đường biên không quá lớn.


;; free lisp from cadviet.com
(defun c:tdd ( / tmp dlst p1 file opw msg id)
(command "undo" "be")
(setq dlst (list(strcat "X" "\t" "Y"
;;;;;;;;;;;;;;;;;"\t" "Z"
"\n"))
oldos (getvar "osmode")
pg (getvar "ucsorg")
file (strcat (getvar "DWGPREFIX") (substr (getvar "DWGNAME") 1 (- (strlen (getvar "DWGNAME")) 4)) ".txt")
p (getpoint "\nChon diem nam trong da giac:")
p2 (getpoint "\n Chon goc toa do ")
ptlst (list)
hlst (list)
dplst (list)
i 0)
(setvar "osmode" 0)
(if (= p2 nil)
(setq p2 (list 0 0 0))
)
(while (/= p nil)
(command "boundary" p "")
(setq name (entlast)
obj (vlax-ename->vla-object name) )
(while (/= (vlax-curve-getPointAtParam obj (1+ i)) nil)
(setq p1 (vlax-curve-getPointAtParam obj i)
ptlst (append ptlst (list p1))
dplst (append dplst (list (list i p1)))
)
(setq i (1+ i))
);;;;;;;;;;;;; End while vlax

(setq ssp (ssget "CP" ptlst (list (cons 0 "POINT")))
n (sslength ssp)
j 0
) ;;;;;;;;;;;; End setq
(while (< j n)
(setq p (cdr (assoc 10 (entget (ssname ssp j ))))
p0 (vlax-curve-getclosestpointto obj p)
pa (vlax-curve-getparamatpoint obj p0)
)
(if (equal (distance p0 p) 0 0.00001)
(progn
(setq dplst (append dplst (list (list pa p0))))
)
)
(setq j (1+ j))
) ;;;;;;;;;;;; End while j
(setq dplst (vl-sort dplst '(lambda (x1 x2) (< (car x1) (car x2)))))
(setq pdlst (list))
(foreach l dplst
(setq pdlst (append pdlst (cdr l)))
) ;;;;;;;;;;;;; End foreach l
(foreach d pdlst
(setq dlst (append (list (strcat (rtos (- (car d) (car p2) (car pg)) 2 3)
"\t"
(rtos (- (cadr d) (cadr p2) (cadr pg)) 2 3)
;;;;;;;;;;;;;;;;"\t"
;;;;;;;;;;;;;;;;(rtos (- (caddr d) (caddr p2) (caddr pg)) 2 3)
)
)
dlst)
)
) ;;;;;;;;;;;;;;;;;End foreach d

(setq ans (strcase (getstring "\n Ban muon tiep tuc (y or n): ")))
(if (/= ans "N")
(progn
(setq p (getpoint "\n Hay chon diem thuoc da giac tiep theo")
i 0)
)
(setq p nil)
) ;;;;;;;;;;;;;;;;;;;End if
(setq pdlst (append pdlst (list (car pdlst))))
(setq dlst (append (list "\n") dlst))
(setq hlst (append hlst (list pdlst))
dplst (list)
ptlst (list)
) ;;;;;;;;;;;;;;;; End setq
(command "erase" name "")
) ;;;;;;;;;;;;;;;;;;;;; End while p
(foreach lst hlst
;;;;;;;;;;;;;;;;;;;;;;;;(wtxt lst)
)

(setq dlst (reverse dlst))
(setq ;file "d:\\tien\\diem.txt"
opw (open file "w")
)
(foreach n dlst (write-line n opw))
(close opw)
(setvar "osmode" oldos)
(command "undo" "e")

)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun wtxt (lst / )
(setq n (length lst)
i 0)
(repeat (1- n)
(setq goc (angle (nth i lst) (nth (1+ i) lst))
x (- (car (nth i lst)) (car pg))
y (- (cadr (nth i lst)) (cadr pg))
z (- (caddr (nth i lst)) (caddr pg))
pt (polar (list x y z) (- goc (/ pi 2)) 2)
i (1+ i)
)
(if (and (> goc (/ pi 2)) (<= goc (* 3 (/ pi 2))) )
(setq goc (+ goc pi))
)
(command "text" "j" "m" pt 0.5 (* goc (/ 180 pi)) (strcat "(" (rtos x 2 3) "," (rtos y 2 3) ")" ) )
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



Trong lisp này mình sử dụng các parameter của các điểm trên boundary để sắp xếp lại chúng theo thứ tự tạo thành boundary và dùng hàm (vlax-curve-getclosestpointto ......) để xác đ5nh điểm thuộc boundary bạn ạ.
Hãy so sánh cái lisp này với cái lisp cũ của mình để tìm sự khác biệt và tương đồng giữa chúng.
Hy vọng lisp thỏa mãn các yêu cầu bạn đã đặt ra....

Chào bác Bình Thấy bác rất nhiệt tình giúp đỡ người khác nên em cũng bắt tay vào nghiên cứu tiếp cái lisp nghe vẻ "xương" này.
Thấy code trên của bác có đoạn (setq ssp (ssget "CP" ptlst (list (cons 0 "POINT"))) em chợt nảy ra một ý như thế này.
1. quét tất cả các đường line, pline trên bản vẽ. chèn point vào các đỉnh line.
2. Vẫn tạo boundary bình thường để lấy các đỉnh của boundary dùng (ssget "cp" các đỉnh này để quét qua các point nằm trên Boundary đó.
3. xuất toạ độ các point. Đến đây thì em bị mắc một chút là chưa biết lọc và loại bỏ các điểm trùng nhau.
đây là code

;; free lisp from cadviet.com
(defun c:tdd ()
(command "undo" "be")
(setq dlst (list (strcat "X" "\t" "\t" "Y" "\n"))
oldos (getvar "osmode")
file (strcat (getvar "DWGPREFIX") (substr (getvar "DWGNAME") 1 (- (strlen (getvar "DWGNAME")) 4)) ".txt")
p (getpoint "\nChon diem nam trong da giac:")
k 0
ptlst nil
ssl (ssget "x" '((0 . "line,lwpolyline")))
)
(setvar "osmode" 0)
(while (< k (sslength ssl))
(setq pp1 (cdr (assoc 10 (entget (ssname ssl k))))
pp2 (cdr (assoc 11 (entget (ssname ssl k)))))
(command "point" pp1 "point" pp2)
(setq k (1+ k))
)
(while (/= p nil)
(command "boundary" p "")
(setq name (entlast)
i 0
obj (vlax-ename->vla-object name))
(while (/= (vlax-curve-getPointAtParam obj i) nil)
(setq p1 (vlax-curve-getPointAtParam obj i)
ptlst (append (list p1) ptlst)
i (1+ i))
)
(setq ssp (ssget "CP" ptlst (list (cons 0 "POINT")))
n (sslength ssp)
j 0
)
(while (< j n)
(setq p1 (cdr (assoc 10 (entget (ssname ssp j)))))
(setq dlst (append (list (strcat (rtos (car p1) 2 3) "\t" (rtos (cadr p1) 2 3))) dlst))
(setq j (1+ j))
)
(setq ans (strcase (getstring "\n Ban muon tiep tuc (y or n): ")))
(if (/= ans "N")
(progn
(setq p (getpoint "\n Hay chon diem thuoc da giac tiep theo")
i 0)
)
(setq p nil)
)
(command "erase" name "")
)
(command "erase" ssp "")
(setq dlst (reverse dlst))
(setq opw (open file "w"))
(foreach n dlst (write-line n opw))
(close opw)
(setvar "osmode" oldos)
(command "undo" "e")
)

  • 1
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#2123 phamvanthiet108

phamvanthiet108

    biết vẽ polygon

  • Members
  • PipPip
  • 73 Bài viết
Điểm đánh giá: 11 (tàm tạm)

Đã gửi 05 October 2010 - 10:43 AM

Các Bác giúp em với.Có Lisp nào chuyển text chữ số có dấu phấy thành dấu chấm ko.
File do day.
http://www.cadviet.c.../drawing2_4.dwg
  • 0

#2124 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 05 October 2010 - 10:46 AM

..................
PS : Liệu có cách nào giãn 2 đường biên ra thì các đường thẳng vuông góc với các đường này tại đỉnh line tự stretch ra theo (như associate sim ấy ạ)
............

Đây là ý tuởng hay.

1. Từ Cad 2010, có lệnh GeomConstraint (hoặc MENU -> Parametric) có khả năng tạo các Link liên kết các đối tuợng với nhau.
Để hiểu rõ hơn, bạn có thể nghiên cứu các Option của nó GeomConstraint

2. Hoặc dùng REACTOR trong VisualLisp để Connect các điểm cuối của các đối tuợng lại với nhau.
tham khảo VD của VUVUZELA connect
  • 0

#2125 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 05 October 2010 - 10:57 AM

Các Bác giúp em với.Có Lisp nào chuyển text chữ số có dấu phấy thành dấu chấm ko.
File do day.
http://www.cadviet.c.../drawing2_4.dwg

Cái này bạn chỉ cần dùng lệnh find và replace all dấu , bằng dấu . là được cần gì dùng đến lisp.
  • 2
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#2126 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 05 October 2010 - 10:59 AM

Các Bác giúp em với.Có Lisp nào chuyển text chữ số có dấu phấy thành dấu chấm ko.
File do day.
http://www.cadviet.c.../drawing2_4.dwg

Dùng lệnh FIND
  • 1

#2127 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 05 October 2010 - 11:10 AM

Chào bạn ketxu,
Hề hề hề,
Trên diễn đàn có lisp scale theo một chiều mà, có cả lisp scale theo hai chiều với các tỷ lệ khác nhau nũa cơ mà. Bạn ngâm cứu thử coi. Có khi lại quá đạt yêu cầu thì gay......
Cái PS của bạn có thể làm được nếu bạn ngâm cứu kỹ cái lisp vẽ tường của bác Phamngoctukts ,( cái đoạn trim các đầu mút đó) và ứng dụng vào trường hợp của bạn. Cụ thể là dùng lệnh trim với tùy biến fence bạn ạ.

Chúc bạn thành công, nếu có trở ngại hãy post lên nhé.

Tks bác.Đúng là e quên béng mất việc scale 1 chiều ^^.Nhưng gặp đường xiên ấy,thì e k biết sao đây.Hơn nữa trong 1 bv có nhiều cái x,nhiều cái Y.Lần nào dùng xsc e cũng phải chọn xem là x,hay y :|

Đây là ý tuởng hay.

1. Từ Cad 2010, có lệnh GeomConstraint (hoặc MENU -> Parametric) có khả năng tạo các Link liên kết các đối tuợng với nhau.
Để hiểu rõ hơn, bạn có thể nghiên cứu các Option của nó GeomConstraint

2. Hoặc dùng REACTOR trong VisualLisp để Connect các điểm cuối của các đối tuợng lại với nhau.
tham khảo VD của VUVUZELA connect

Vâng.Sau khi nâng cấp máy e sẽ cài 2010 để nghiên cứu.Máy e cùi quá,dùng thử 2010 n bị giật quá bác ạ
Tiện đây e xin nhờ bác nâng cấp lisp thống kê text bác đã viết trước đây,e muốn text khi export ra sắp xếp theo chiều tăng dần A,B,C và tạo bảng xinh xinh quanh nó thì có được không ạ ?
Thong ke text va viet ra man hinh
(defun c:tkt (/ lst msp pt ss str txtsiz)
(vl-load-com)
(setvar "Textstyle" "KCVN-COMM")
(if (setq ss (ssget(list (cons 0 "TEXT"))))
(progn
(foreach e (mapcar 'vlax-ename->vla-object(vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
(setq str (vla-get-TextString e))
(if (not (assoc str lst))
(setq lst (cons (cons str 1) lst))
(setq lst (subst (cons str (1+ (cdr (assoc str lst))))
(assoc str lst) lst))) )
(setq lst (vl-sort lst '(lambda (x y) (< (cdr x) (cdr y))))
pt (getpoint "\nDiem dat Bang :" )
txtsiz (* (getvar "dimtxt")(getvar "dimscale"))
msp (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
(foreach e lst
(vla-addtext msp (cdr e) (vlax-3d-point pt) txtsiz )
(vla-addtext msp (car e) (vlax-3d-point (polar pt 0 (* 5 txtsiz))) txtsiz )
(setq pt (polar pt (/ pi -2) (* 1.5 txtsiz))) ) )
(alert "Khong chon duoc Text.") )
(princ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  • 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


#2128 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 05 October 2010 - 11:42 AM

Chào bác Bình Thấy bác rất nhiệt tình giúp đỡ người khác nên em cũng bắt tay vào nghiên cứu tiếp cái lisp nghe vẻ "xương" này.
Thấy code trên của bác có đoạn (setq ssp (ssget "CP" ptlst (list (cons 0 "POINT"))) em chợt nảy ra một ý như thế này.
1. quét tất cả các đường line, pline trên bản vẽ. chèn point vào các đỉnh line.
2. Vẫn tạo boundary bình thường để lấy các đỉnh của boundary dùng (ssget "cp" các đỉnh này để quét qua các point nằm trên Boundary đó.
3. xuất toạ độ các point. Đến đây thì em bị mắc một chút là chưa biết lọc và loại bỏ các điểm trùng nhau.
đây là code

Chào bác Phamngoctukts,
Bác cứ nói vậy làm mình ..... ngượng chết. Cái lisp này vốn là của bác đó, mình chỉ mót về xào nấu tí ti cho nó thêm tí gia vị cho vừa mồm bạn hdt4151 thôi mà. Bạn ấy còn đang chê khó nuốt đấy bác ạ. Hề hề hề.,....
Về ý tưởng của bác mình thấy có một vài ý kiến như sau:
1/- Quét tất cả các line và lwpolyline trên bản vẽ rồi gắn point cho các đỉnh.
Điều này sẽ tạo ra một khối lượng khá lớn các điểm dư thừa khi có những line không thuộc các cạnh của boundary.
2/- Đây chính là cái mình đã chọn và làm lisp dựa trên đó. Các đỉnh của boundary thì bác đã làm, còn các point khác thì được chọn bởi tập ssp và bác yên tâm là nó chả có thằng nào trùng với các đỉnh boundary được do boundary được tạo sau và bác không hề đặt point vào đó.
Do tập ssp có thể chứa các point không thuộc các cạnh boundary nên mình dùng hàm (vlax-curve-getclosestpointto....) để làm điều kiện kiểm tra xem point có thuộc cạnh của boundary hay không. Nếu point thuộc cạnh tứcboun thỏa điều kiện của hàm (if (equal .......) thì nhét nó vào trong tập hợp dỉnh boundary của bác.
Tiếp theo là dùng hàm (vl-sort ....) để sắp xếp lại trật tự các point và đỉnh dựa vào parameter của các point và đỉnh trên boundary.
Ở đây mình chưa xét tới trường hợp point trùng nhau hay trùng với đỉnh của boundary do ngẫu nhiên như bác.
Có được cái list này rồi thì việc xuất text cứ copy của bác là ngon lành.
Bác xem lisp của mình ở trên sẽ rõ.
3/- Việc lọc các point trùng nhau hay trùng với đỉnh của boundary có thể thực hiện được bằng cách xét parameter của chúng hay xét tọa độ của chúng đồng thời với ename của nó trong một list các point bác ạ Nếu trùng thì bác cứ delete nó khỏi tập chọn là Ok (sử dụng hàm ssdel)

Ấy là mình nghĩ vậy chứ chưa làm thử bác ạ. Nếu bác rảnh có thể làm thử theo hướng này xem sao. Mình phải chờ phản hồi từ bạn hdt4151 đã chứ cứ nấu hoài mà người ăn cứ chê hoài thì cũng hết cảm hứng nấu bác ạ.
Hề hề hề.....

PS: Xuong xẩu không phải là vấn đề chính vì dân đi mót thì gặm xương là cái chắc, chê thì có mà ăn cám bác ạ. Vấn đề là ở chỗ nấu nướng, người ăn lại khó tính nên chửa biết nấu sao cho vừa miệng họ, hết chữa mặn lại chữa ngọt, rồi sắp tới có thể là cay là chua hay là gì gì đó bác ạ. Đành chờ vậy. Hề hề hề.....
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2129 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 05 October 2010 - 12:08 PM

Tks bác.Đúng là e quên béng mất việc scale 1 chiều ^^.Nhưng gặp đường xiên ấy,thì e k biết sao đây.Hơn nữa trong 1 bv có nhiều cái x,nhiều cái Y.Lần nào dùng xsc e cũng phải chọn xem là x,hay y :|

Hề hề hề,
Với đường xiên thì chơi kiểu xiên.
1/- xoay nó về thẳng theo hệ trục
2/- Xoay hệ trục về thẳng theo nó.
Và tất nhiên là sau đó xoay nó trở lại như cũ. Có thể dùng lisp cho vụ này.
Hề hề hề,....
Cái vụ chọn x hay y thì đành chịu, có thể mặc định là x, còn y thì phải chọn, như vậy cũng nhanh hon được tí xíu. Hề hề hề. Ới bác Duy ơi, cứu bồ 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.

#2130 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 05 October 2010 - 12:33 PM

.....................
Tiện đây e xin nhờ bác nâng cấp lisp thống kê text bác đã viết trước đây,e muốn text khi export ra sắp xếp theo chiều tăng dần A,B,C và tạo bảng xinh xinh quanh nó thì có được không ạ ?
...............

Tự hỏi và trả lời.

Lisp này mà có chế độ sắp xếp text,tùy chỉnh textstyle theo 1 text,và kẻ bảng xung quanh thì tuyệt vời ^^..Tks a gia_bach ^^


bài viết số 9 : http://www.cadviet.c...o...st&p=107988
  • 1

#2131 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 05 October 2010 - 12:53 PM

ý,topic kia e post ý kiến xong lâu rồi không vào,thấy diễn đàn k báo bài mới,chắc bị trôi mất.Cảm ơn a gia_bach^^.Nhưng mà anh ơi,e hỏi luôn là với bảng tạo ra,mình làm sao mà change được textstyle,hoặc tabstyle ạ :cheers: E k biết dòng nào trong code quyết định textstyle,thấy nó in ra là StanDARD luôn,muốn chỉnh laiị cực quá :cheers:.

Hề hề hề,
Với đường xiên thì chơi kiểu xiên.
1/- xoay nó về thẳng theo hệ trục
2/- Xoay hệ trục về thẳng theo nó.
Và tất nhiên là sau đó xoay nó trở lại như cũ. Có thể dùng lisp cho vụ này.
Hề hề hề,....
Cái vụ chọn x hay y thì đành chịu, có thể mặc định là x, còn y thì phải chọn, như vậy cũng nhanh hon được tí xíu. Hề hề hề. Ới bác Duy ơi, cứu bồ nè.....

E nghĩ là dùng lisp thì nhanh hơn.Move nó ra theo phương vuông góc với 2 đỉnh line,base point vẫn là điểm pick vào đường giữa.Nhưng bị vướng vấn đề là làm sao tách ra được chú nào ở bên trái line giữa,chú nào bên phải đặng mà move cho đúng hướng :cheers:(
  • 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


#2132 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 05 October 2010 - 01:06 PM

Ấy là mình nghĩ vậy chứ chưa làm thử bác ạ. Nếu bác rảnh có thể làm thử theo hướng này xem sao. Mình phải chờ phản hồi từ bạn hdt4151 đã chứ cứ nấu hoài mà người ăn cứ chê hoài thì cũng hết cảm hứng nấu bác ạ.
Hề hề hề.....

PS: Xuong xẩu không phải là vấn đề chính vì dân đi mót thì gặm xương là cái chắc, chê thì có mà ăn cám bác ạ. Vấn đề là ở chỗ nấu nướng, người ăn lại khó tính nên chửa biết nấu sao cho vừa miệng họ, hết chữa mặn lại chữa ngọt, rồi sắp tới có thể là cay là chua hay là gì gì đó bác ạ. Đành chờ vậy. Hề hề hề.....

Nhưng mà lisp của bác báo lỗi không chạy được. Đến bước chọn gốc toạ độ là báo lỗi. Bác xem lại cái nhìn code của bác hoa cả mắt trả biết sai chỗ nào hề hề.
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#2133 phamvanthiet108

phamvanthiet108

    biết vẽ polygon

  • Members
  • PipPip
  • 73 Bài viết
Điểm đánh giá: 11 (tàm tạm)

Đã gửi 05 October 2010 - 01:47 PM

Dùng lệnh FIND

em làm được rùi cám ơn bác Tue_NV
  • 0

#2134 hdt4151

hdt4151

    biết vẽ pline

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

Đã gửi 05 October 2010 - 03:52 PM

@phamthanhbinh: mình cùng ý kiến với bạn phamngoctukts ^^!, vì point không có sẵn mà chỉ có sẵn các đường line, pl giao nhau tạo ra các điểm (srr, lúc trc mình nhầm về vụ point có sẵn hay k bạn đừng giận nhé). Cách tạo point như bạn phamngoctukts rất đúng với ý mình, cứ theo hướng đó nhé (xóa các điểm trùng nhau, xác định thứ tự ..) . Việc tạo ra lisp không chỉ đơn giản là 1 bài toán bình thường, nó có thể giúp việc tính phần mềm của ks nhanh gấp 10 lần :cheers:
  • 0

#2135 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 05 October 2010 - 04:18 PM

@phamthanhbinh: mình cùng ý kiến với bạn phamngoctukts ^^!, vì point không có sẵn mà chỉ có sẵn các đường line, pl giao nhau tạo ra các điểm (srr, lúc trc mình nhầm về vụ point có sẵn hay k bạn đừng giận nhé). Cách tạo point như bạn phamngoctukts rất đúng với ý mình, cứ theo hướng đó nhé (xóa các điểm trùng nhau, xác định thứ tự ..) . Việc tạo ra lisp không chỉ đơn giản là 1 bài toán bình thường, nó có thể giúp việc tính phần mềm của ks nhanh gấp 10 lần :cheers:


To : bác Bình.
Cứ thế, cứ theo hướng đó mà đi bác nhé!
Chúc bác "mạnh cái đôi chân" mà đi bác nhỉ! :cheers:

..................
PS: Xuong xẩu không phải là vấn đề chính vì dân đi mót thì gặm xương là cái chắc, chê thì có mà ăn cám bác ạ. Vấn đề là ở chỗ nấu nướng, người ăn lại khó tính nên chửa biết nấu sao cho vừa miệng họ, hết chữa mặn lại chữa ngọt, rồi sắp tới có thể là cay là chua hay là gì gì đó bác ạ. Đành chờ vậy. Hề hề hề.....

"Chua cay mặn ngọt" ... Hề hề hề.....
  • 0

#2136 huong259

huong259

    biết lệnh refedit

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

Đã gửi 05 October 2010 - 04:28 PM

"Chua cay mặn ngọt" ... Hề hề hề.....

"Chua cay mặn ngọt" gì em không biết
Em chỉ có câu hỏi sao anh không giả nhời câu hỏi của em, hỏi là quyền của em và trả lời cũng là quyền của anh, em ko trách anh đâu em chỉ hỏi để mà hỏi thôi:

http://www.cadviet.c...o...=274&st=520
  • 1

#2137 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 05 October 2010 - 04:40 PM

"Chua cay mặn ngọt" gì em không biết
Em chỉ có câu hỏi sao anh không giả nhời câu hỏi của em, hỏi là quyền của em và trả lời cũng là quyền của anh, em ko trách anh đâu em chỉ hỏi để mà hỏi thôi:

http://www.cadviet.c...o...=274&st=520

em chỉ hỏi để mà hỏi thôi nhưng mà nếu anh gia_bach giả nhời thì em sẽ vui hơn hè hè :cheers:
Việc tạo Point là cách hay nhưng nếu tạo point theo cách của bạn Tú là không ổn.
Còn của bác Bình vì các Point không có nên phải vẽ Point, ít thì không sao, nhiều thì mệt chết được. <_<

Các bác thử cách không vẽ Point và điểm giao lấy từ các giao điểm của Boundary và các Line hoặc PLINE thử xem. Hề hề, để các bác suy nghĩ thêm :cheers:
  • 1

#2138 18011985

18011985

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 255 Bài viết
Điểm đánh giá: 61 (tàm tạm)

Đã gửi 05 October 2010 - 04:42 PM

Bộp Bộp đề nghị trật tự, đề nghị mọi người tranh luận chuyển sang mục khác để tránh làm loãng mục Viết lsp theo yêu cầu. Chân thành cảm ơn. :cheers:
  • 0
Trăng 16 trăng tròn
Em 16 bụng ... như trăng

Hướng dẫn sử dụng diễn đàn:
Để cảm ơn hay bài viết có ích: Ấn dấu + cuối bài.
Không vừa lòng hay bài spam: Ấn dấu - cuối bài.

#2139 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 05 October 2010 - 04:54 PM

Nhưng mà lisp của bác báo lỗi không chạy được. Đến bước chọn gốc toạ độ là báo lỗi. Bác xem lại cái nhìn code của bác hoa cả mắt trả biết sai chỗ nào hề hề.

Hề hề hề,
Không phải đâu là không phải đâu, thấy bạn hdt4151 hỏi bác trả lời tưởng là bác biết rồi chớ. Tại vì cái điều kiện của lisp này là trong vùng chọn phải có các point rồi. Nếu hổng có là nó đâu có chạy được. Điều này mình đã nói rõ khi post bài rồi mừ ......
Ý của mình đã nói rõ trong bài trả lời bạn hdt4151. Bác chỉ cần point trước vài phát trong các boundary là nó chạy vè vè bác à.
Đây là cái mình đã cho thêm hàm điều kiện if để tránh cái lỗi nớ, đồng thời mình bổ sung luôn cả phần lọc các point trùng nhau hoặc trùng đỉnh boundary như bác đã gợi ý.
Lisp nó như rừng là do viết đi viết lại, thêm mắm thêm muối đó bác, mà mình ngại viết lại từ đầu nên cứ nhè thằng cũ mà thêm thôi. Lại ngại nghỉ tên mới cho các biến nên cứ lặp đi lặp lại mấy cái pd, dp, pt..... làm nó rối thêm bác ạ.
Do là thợ đụng nên đụng dâu sửa đó nó mới thế. Rất mong bác thông cảm.
Tuy nhiên mình cũng đã cố tách bạch nó ra thành từng đoạn với chức năng riêng để dễ theo dõi.
Cụ thể cấu tạo của nó như sau:
1/- Đoạn đầu cho đến dòng code (while (/= p nil) .... là của bác nên chắc bác đã rõ. Mình chỉ bổ sung thêm cái dòng chọn điểm gốc tọa độ và hàm điều kiện cho thằng này là vì yêu cầu của bạn hdt4151 muốn được chọn gốc thoải mái. Đồng thời thêm vô thằng (getvar "ucsorg") để lấy tọa độ của gốc tọa độ người dùng (Cái này cũng là do bạn hdt4151 đẻ ra yêu cầu bổ sung ạ)
2/- Bắt đầu vào vòng lặp để cho người dùng được chọn nhiều vùng cần ghi tọa độ. (while (/= p nil)
2.1/- Bước thứ nhất trong vòng lặp được tính tới lúc kết thúc hàm (while (vlax-.......)Nhằm tạo ra danh sách các tọa độ đỉnh của boundary.
Cái này cũng của bác. Mình chỉ thêm vô tạo cái danh sách dtlist kết hợp giữa vị trí đỉnh hay cũng chính là parameter của đỉnh với tọa độ của nó để sử dụng cho việc dùng vl-sort sau này thôi bác ạ.
2.2/- Bước thứ hai từ hàm (setq ssp (ssget......)) cho đến kết thúc hàm (if ssp........). Ấy là dùng để xác định tập hợp các điểm trong vùng chọn và loại bớt những thằng không nằm trên cạnh boundary, đồng thời gán thêm các cặp (parameter tọa-độ) vào cái dtlst đã được lập ở trên.
2.3/- Bước thứ ba từ (setq dplst (vl-sort....)) cho đến kết thúc hàm (setq dplst dplst1) là để xử lý thằng dtlst này, sắp xếp lại theo tứ tự của parameter và lọc bớt những thằng trùng nhau theo như góp ý của bác.
2.4/- Bước thứ tư từ (setq pdlst (list)) cho tới hết hàm (if (/= ans "N") là mình kế thừa cái lisp của bác nhằm tạo ra các record trong dlst phục vụ cho việc xuất text sau này. Ở đây có hơi khác chút xíu ở chỗ cách tạo ra pdlst. Và cái biến này là mình kế thừa cái pdlst của bác vì lười đặt tên mới. cũng vì lười nên lại đẻ ra cái thằng (setq pdlst (list)) bác ạ, nhằm tránh bị thống kê các đỉnh boundary hai lần.
2.5/- Bước cuối cùng từ (setq pdlst (append pdlst (list (car pdlst)))) cho đến khi kết thúc vòng lặp (while (/= p nil)...) là những cái mình làm thêm do yêu cầu của bạn hdt4151 nhằm chuẩn bị cho vòng lặp tiếp theo.
(setq pdlst (append pdlst (list (car pdlst)))) hàm này để thêm điểm đầu của boundary vào danh sách để phục vụ cho việc ghi text lên cạnh boundary do mình hiểu nhầm khẩu vị của bạn ấy.
(setq dlst (append (list "\n") dlst)) Hàm này nhằm tạo một dòng trống giữa các boundary khác nhau trên file text.
(setq hlst (append hlst (list pdlst))
dplst (list)
ptlst (list)
) ;;;;;;;;;;;;;;;; End setq
Khúc này để tạo một list các point có trên mỗi boundary tách biệt với nhau phục bụ việc ghi text ra bản vẽ và đặt các biến dplst, ptlst về trạng thái ban đầu nhằm tránh việc râu ông nọ cắm cằm bà kia. Hề hề hề.....
3/- Là phần ghi dữ liệu ra file text và ghi lên bản vẽ. bác đã quá rành.
Trong phần này chỉ có lưu ý là mình sử dụng thêm hàm con (wrtxt .....) có thể bị trùng tên với các hàm ghi text ra file chứ không phải vẽ text lên bản vẽ. Vì lười đặt tên bác ạ. Do vậy khi dùng cần tắt các lisp loanh quanh đi kẻo mà trùng tên lệnh thì toi bác ạ.
Thực tế thì cái hàm wrtxt này đã bị mình vô hiệu hóa bằng cách củ chuối rồi. Bác có thể khôi phục nó để test thử coi sao. Vì đã mất công đẻ ra mà lại bóp chết nó nghe hơi buốt ruột nên bác thông cảm nha. Cứ để đó có ai thích thì khôi phục lại dùng chơi bác nhể....

Dông dài mãi, Lisp đây bác ạ

;; free lisp from cadviet.com
(defun c:tdd ( / tmp dlst p1 file opw msg id)
(command "undo" "be")
(setq dlst (list(strcat "X" "\t" "Y"
;;;;;;;;;;;;;;;;;"\t" "Z"
"\n"))
oldos (getvar "osmode")
pg (getvar "ucsorg")
file (strcat (getvar "DWGPREFIX") (substr (getvar "DWGNAME") 1 (- (strlen (getvar "DWGNAME")) 4)) ".txt")
p (getpoint "\nChon diem nam trong da giac:")
p2 (getpoint "\n Chon goc toa do ")
ptlst (list)
hlst (list)
dplst (list)
i 0)
(setvar "osmode" 0)
(if (= p2 nil)
(setq p2 (list 0 0 0))
)
(while (/= p nil)
(command "boundary" p "")
(setq name (entlast)
obj (vlax-ename->vla-object name) )
(while (/= (vlax-curve-getPointAtParam obj (1+ i)) nil)
(setq p1 (vlax-curve-getPointAtParam obj i)
ptlst (append ptlst (list p1))
dplst (append dplst (list (list i p1)))
)
(setq i (1+ i))
);;;;;;;;;;;;; End while vlax

(setq ssp (ssget "CP" ptlst (list (cons 0 "POINT"))))
(if ssp
(progn
(setq n (sslength ssp)
j 0
) ;;;;;;;;;;;; End setq

(while (< j n)
(setq p (cdr (assoc 10 (entget (ssname ssp j ))))
p0 (vlax-curve-getclosestpointto obj p)
pa (vlax-curve-getparamatpoint obj p0)
)
(if (equal (distance p0 p) 0 0.00001)
(setq dplst (append dplst (list (list pa p0))))
)
(setq j (1+ j))
) ;;;;;;;;;;;; End while j
) ;;;;;;;;;;;; End progn
) ;;;;;;;;;;;;End if ssp
(setq dplst (vl-sort dplst '(lambda (x1 x2) (<= (car x1) (car x2))))
dplst1 (list)
m (length dplst)
k 0
)
(while (< k m)
(if (/= (car (nth k dplst)) (car (nth (1+ k) dplst)))
(setq dplst1 (append dplst1 (list (nth k dplst))))
)
(setq k (1+ k))
)
(setq dplst dplst1)
(setq pdlst (list))
(foreach l dplst
(setq pdlst (append pdlst (cdr l)))
) ;;;;;;;;;;;;; End foreach l
(foreach d pdlst
(setq dlst (append (list (strcat (rtos (- (car d) (car p2) (car pg)) 2 3)
"\t"
(rtos (- (cadr d) (cadr p2) (cadr pg)) 2 3)
;;;;;;;;;;;;;;;;"\t"
;;;;;;;;;;;;;;;;(rtos (- (caddr d) (caddr p2) (caddr pg)) 2 3)
)
)
dlst)
)
) ;;;;;;;;;;;;;;;;;End foreach d

(setq ans (strcase (getstring "\n Ban muon tiep tuc (y or n): ")))
(if (/= ans "N")
(progn
(setq p (getpoint "\n Hay chon diem thuoc da giac tiep theo")
i 0)
)
(setq p nil)
) ;;;;;;;;;;;;;;;;;;;End if
(setq pdlst (append pdlst (list (car pdlst))))
(setq dlst (append (list "\n") dlst))
(setq hlst (append hlst (list pdlst))
dplst (list)
ptlst (list)
) ;;;;;;;;;;;;;;;; End setq
(command "erase" name "")
) ;;;;;;;;;;;;;;;;;;;;; End while p
(foreach lst hlst
;;;;;;;;;;;;;;;;;;;;;;;;(wtxt lst)
)

(setq dlst (reverse dlst))
(setq ;file "d:\\tien\\diem.txt"
opw (open file "w")
)
(foreach n dlst (write-line n opw))
(close opw)
(setvar "osmode" oldos)
(command "undo" "e")

)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun wtxt (lst / )
(setq n (length lst)
i 0)
(repeat (1- n)
(setq goc (angle (nth i lst) (nth (1+ i) lst))
x (- (car (nth i lst)) (car pg))
y (- (cadr (nth i lst)) (cadr pg))
z (- (caddr (nth i lst)) (caddr pg))
pt (polar (list x y z) (- goc (/ pi 2)) 2)
i (1+ i)
)
(if (and (> goc (/ pi 2)) (<= goc (* 3 (/ pi 2))) )
(setq goc (+ goc pi))
)
(command "text" "j" "m" pt 0.5 (* goc (/ 180 pi)) (strcat "(" (rtos x 2 3) "," (rtos y 2 3) ")" ) )
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;




Hề hề hề, mong bác thông cảm chớ có giận mình vì vô duyên. Chúc bác vui.
  • 2
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2140 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 05 October 2010 - 06:01 PM

@phamthanhbinh: mình cùng ý kiến với bạn phamngoctukts ^^!, vì point không có sẵn mà chỉ có sẵn các đường line, pl giao nhau tạo ra các điểm (srr, lúc trc mình nhầm về vụ point có sẵn hay k bạn đừng giận nhé). Cách tạo point như bạn phamngoctukts rất đúng với ý mình, cứ theo hướng đó nhé (xóa các điểm trùng nhau, xác định thứ tự ..) . Việc tạo ra lisp không chỉ đơn giản là 1 bài toán bình thường, nó có thể giúp việc tính phần mềm của ks nhanh gấp 10 lần :cheers:

Chào bạn hdt4151,
Hề hề hề,
Biết ngay cái nhà ông mãnh này mà. Đã bảo nghĩ cho kỹ trước khi hỏi thì không nghe. Khi người ta hỏi point đã có chưa thì bảo point đã có sẵn.

Các điểm đó do người khác tạo ra có sẵn từ trước, vấn đề đau đầu chình là thứ tự của điểm đó.
- Giả sử đa giác có n cạnh và có m số điểm nằm trên cạnh của đa giác.
Cho i:=1 to m
j:=1 to n
+ Xác định được m điểm nằm trên cạnh đa giác với mã dxf = 0 !?
+ Xét cạnh 1 : Tìm toạ độ 2 điểm đầu, cuối của cạnh 1 : x1 y1 x2 y2 => dx = x1-x2 dy = y1-y2
Phương trình của cạnh 1 là : y =kx (k=dx/dy)
Nếu điểm thứ i có x2>xi>x1 (với x2>x1) => xét xem nếu yi = k.xi => điểm i thuộc cạnh 1 .Nếu yi # k.xi => điểm i không thuộc cạnh 1 => Xét cạnh 2 => ....=> xét cạnh thứ n.

Bạn xem giải thuật này có thể thực hiện được k ?
Hình minh hoạ
http://www.cadviet.com/upfiles/3/c.dwg

Bây giờ lại quay ngược lại 180 độ với một lời xin lỗi. Hề hề hề. mình có lỗi đâu mà cho bạn được. Vị này có khi còn cay hơn ớt nhiếu các bác nhỉ?????

Bạn có hiểu rằng chỉ vì cái thiếu suy nghĩ của bạn mà khiến nhiều người khác phải đau đầu không nhỉ ??? Sự vô tâm của bạn sẽ trở thành ích kỷ và thậm chí là độc ác nữa đó nếu bạn không tự điều chỉnh lấy cách làm việc và cách suy nghĩ bạn ạ. Bạn cần tôn trọng sự lao động của người khác cũng như chính sự lao động của bạn . Là một cán bộ kỹ thuật mà suy nghĩ hời hợt , trình bày vấn đề không rõ ràng khiến mọi người hiểu lầm thì sẽ có ngày bạn phải trả giá không nhỏ đâu. Mình thật sự không hài lòng về cái cách suy nghĩ và làm việc của bạn. Cho dù đây là diễn đàn mở và dành cho tất cả mọi người nhưng không có nghĩa là không cần đến sự thận trọng và cân nhắc khi trình bày yêu cầu của mình. Bạn chỉ có thể có được một đáp án hoàn chỉnh và tối ưu khi bạn trình bày vấn đề một cách hoàn chỉnh và mạch lạc, dễ hiểu nhất. Hơn thế nữa bạn phải thể hiện được sự cầu thị, mong muốn tiên bộ của bạn, chứ không phải với cái cách quăng vấn đề ra vô tội vạ như vậy.

Đúng là việc dùng lisp có thể giúp công việc nhanh hơn nhiều lần, song đó chỉ là đối với những người có kiến thức về lisp thôi. Còn với những người chỉ chuyên đi copy về xài thì chưa chắc đâu. Nhiều khi nó còn gây hại nữa đấy. Việc diễn đàn mở topic viết lisp theo yêu cầu cũng chỉ nhằm mục tiêu giúp đỡ những người muốn học lisp để vận dụng nó cho công việc của mình chứ hoàn toàn không phải là để làm hộ công việc của mọi người. Các lisp có sẵn tuy đã rất nhiều, nhưng không phải ai cũng có thể vận dụng được nó bạn ạ. Nếu bạn không học nó thì cho dù trong tay bạn có hàng ngàn cái lisp bạn cũng vẫn chả thể làm nhanh hơn do yêu cầu công việc luôn luôn đổi mới mà các lisp có sẵn thì ít khi đáp ứng đầy đủ. Vì thế bạn phải cải tiến hoàn thiện thêm cho nó mới được bạn ạ.

Cách mót của mình cũng vậy thôi, mót cái có sẵn về xào nấu sao cho hợp khẩu vị của mình thì xài bạn ạ. Cái lisp mình viết cho bạn cũng là xào nấu từ các lisp có sẵn thôi chứ chả phải tốn kém bao nhiêu cả. Vấn đề là phải hiểu nó mới xào nấu cho ngon được.

Về ý kiến của bác Phamngoctukts thì mình đã trả lời, bạn đọc thêm ở đó. Riêng mình thì nghĩ nếu đó đúng là yêu cầu của bạn, có thể sẽ dùng lisp tìm giao điểm của boundary với các đối tượng khác rồi sau đó làm tương tự như cái lisp của mình là OK.

Hãy chờ đó.
  • 4
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.