Đến nội dung


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

Hướng dẫn lập trình Lisp


  • Please log in to reply
497 replies to this topic

#301 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 27 February 2011 - 12:27 AM

1 cách đơn giản là bác chuyển các giá trị đó thành chuỗi bằng hàm rtos rồi lại chuyển nguợc lại thành số thực.
(atof (rtos x 2 2))
  • 0

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


#302 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 27 February 2011 - 09:22 AM

1 cách đơn giản là bác chuyển các giá trị đó thành chuỗi bằng hàm rtos rồi lại chuyển nguợc lại thành số thực.
(atof (rtos x 2 2))

Cách làm tròn số thực thì mình biết rồi, nhưng cách truy xuất đỉnh của polyline line, lưu vào biến, làm tròn rồi cập nhật lại vào polyline thì mình chưa rõ.
Mình tìm được hàm lấy tọa độ đỉnh trên cadviet
(setq en (ssname (ssget '((0 . "LWPOLYLINE"))) 0) lstp (ACET-GEOM-VERTEX-LIST en))
nhưng hàm này chỉ chạy trên cad đời cao, mình vẫn sd cad2002 thì nó kg chạy, bạn nào biết hàm khác thấp hơn thì chỉ cho mình với. Mình vẫn chưa tìm đc hàm cập nhật lại vào polyline.
  • 0

#303 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 27 February 2011 - 12:31 PM

Không biết cad2002 có Visual Lisp chưa nhỉ.
bác thử cái này để lấy list toạ độ LWpolyline xem

(defun get-vertex-lwpline (e/ iv L)
(setq iv -1 L '())
(repeat (fix (1+ (vlax-curve-getEndParam e)))
(setq iv (1+ iv) L (append L (list (vlax-curve-getPointAtParam e iv))))))
nếu vẫn không đuợc thì đành chơi cái này vậy - autolisp nên chạy dc với mọi bản cad
(defun get-vertex-lwpline (e / lstpt)
(setq lstpt '())
(foreach x (entget e)
(if (= (car x) 10) (setq lstpt (append (list (cdr x)) lstpt)))) lstpt)
Làm tròn tọa độ về 2 chữ số

(mapcar '(lambda (x1) (mapcar '(lambda (x2) (atof(rtos x2 2 2))) x1)) (get-vertex-lwpline (car(entsel))))
Còn việc cập nhật list point đã được làm tròn cho đường pline mình nghĩ là đơn giản thôi mà.
từ record của pline, bác loại bỏ mọi fần tử có mã DXF 10, 40, 41, 42, 91 rồi chèn các điểm point mới vào vị trí sau mã 39. entmod với record mới này là ok
  • 0

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


#304 Tri

Tri

    biết vẽ circle

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

Đã gửi 27 February 2011 - 01:27 PM

Không biết cad2002 có Visual Lisp chưa nhỉ.
bác thử cái này để lấy list toạ độ LWpolyline xem


(defun get-vertex-lwpline (e/ iv L)
(setq iv -1 L '())
(repeat (fix (1+ (vlax-curve-getEndParam e)))
(setq iv (1+ iv) L (append L (list (vlax-curve-getPointAtParam e iv))))))
nếu vẫn không đuợc thì đành chơi cái này vậy - autolisp nên chạy dc với mọi bản cad
(defun get-vertex-lwpline (e / lstpt)
(setq lstpt '())
(foreach x (entget e)
(if (= (car x) 10) (setq lstpt (append (list (cdr x)) lstpt)))) lstpt)
Làm tròn tọa độ về 2 chữ số

(mapcar '(lambda (x1) (mapcar '(lambda (x2) (atof(rtos x2 2 2))) x1)) (get-vertex-lwpline (car(entsel))))
Còn việc cập nhật list point đã được làm tròn cho đường pline mình nghĩ là đơn giản thôi mà.
từ record của pline, bác loại bỏ mọi fần tử có mã DXF 10, 40, 41, 42, 91 rồi chèn các điểm point mới vào vị trí sau mã 39. entmod với record mới này là ok

Bạn coi lại nhé :
(rtos -618.003 2 2) -> "-618.00" -> ok. Nhưng (atof "-618.00") -> -618.0 (Không đúng)
Ngoài ra, cần phải thiết lập biến Dimzin=0 :rolleyes:
  • 0

#305 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 27 February 2011 - 05:59 PM

Bạn coi lại nhé :
(rtos -618.003 2 2) -> "-618.00" -> ok. Nhưng (atof "-618.00") -> -618.0 (Không đúng)
Ngoài ra, cần phải thiết lập biến Dimzin=0 :rolleyes:

Chúng ta đang bàn đến việc làm tròn số, không fải về việc thể hiện 1 số duới dạng chuỗi như thế nào bạn ạ.
[round 618.003 ; 2] = 618.00 = 618.0 = 618.000000000000000000000000000000000000000 = 618
vì thế chả cần biến Dimzin làm gì.
  • 0

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


#306 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 27 February 2011 - 09:43 PM

Không biết cad2002 có Visual Lisp chưa nhỉ.
bác thử cái này để lấy list toạ độ LWpolyline xem


(defun get-vertex-lwpline (e/ iv L)
(setq iv -1 L '())
(repeat (fix (1+ (vlax-curve-getEndParam e)))
(setq iv (1+ iv) L (append L (list (vlax-curve-getPointAtParam e iv))))))
nếu vẫn không đuợc thì đành chơi cái này vậy - autolisp nên chạy dc với mọi bản cad
(defun get-vertex-lwpline (e / lstpt)
(setq lstpt '())
(foreach x (entget e)
(if (= (car x) 10) (setq lstpt (append (list (cdr x)) lstpt)))) lstpt)
Làm tròn tọa độ về 2 chữ số

(mapcar '(lambda (x1) (mapcar '(lambda (x2) (atof(rtos x2 2 2))) x1)) (get-vertex-lwpline (car(entsel))))
Còn việc cập nhật list point đã được làm tròn cho đường pline mình nghĩ là đơn giản thôi mà.
từ record của pline, bác loại bỏ mọi fần tử có mã DXF 10, 40, 41, 42, 91 rồi chèn các điểm point mới vào vị trí sau mã 39. entmod với record mới này là ok

cad2002 có vl rồi nhưng chắc nó chưa có hàm ACET-GEOM-VERTEX-LIS
Việc sd hàm entmod với cod 10 trong trường hợp polyline mình nghỉ kg đc vì hàm assoc chỉ trả về cặp dữ liệu có cod 10 đầu tiên thôi trong khi đó dữ liệu của polyline có nhiều cặp có cod 10. Kg biết mình có nhầm lẫn gì kg
  • 0

#307 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 27 February 2011 - 10:50 PM

cad2002 có vl rồi nhưng chắc nó chưa có hàm ACET-GEOM-VERTEX-LIS
Việc sd hàm entmod với cod 10 trong trường hợp polyline mình nghỉ kg đc vì hàm assoc chỉ trả về cặp dữ liệu có cod 10 đầu tiên thôi trong khi đó dữ liệu của polyline có nhiều cặp có cod 10. Kg biết mình có nhầm lẫn gì kg

Theo thiển ý của mình, bạn có thể làm như thế này xem sao:
- Duyệt từng phần tử trong danh sách record đối tượng (hàm foreach).
- Nếu phần tử nào có (= 10 (car pt)) thì thay X,Y,Z của nó bằng x,y,z [trong đó x=(atof (rtos X 2 2))]
  • 0

* 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.


#308 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 28 February 2011 - 12:01 AM

Chắc cũng k cần list point ra đâu bạn TRUNGNGAMY ạ.
Với LWPlolyline thì :
(defun c:test()
(defun round(x)(atof (rtos x 2 2)))
(foreach x (setq ent (entget (car(entsel))))
(if (= (car x) 10)
(entmod (setq ent(subst (list 10 (round (cadr x))(round (caddr x))) x ent)))
)
)
)
P/S : nick bạn làm mình nhớ VLTK quá ^^
  • 2

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


#309 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 28 February 2011 - 04:08 AM

Chắc cũng k cần list point ra đâu bạn TRUNGNGAMY ạ.
Với LWPlolyline thì :

(defun c:test()
(defun round(x)(atof (rtos x 2 2)))
(foreach x (setq ent (entget (car(entsel))))
(if (= (car x) 10)
(entmod (setq ent(subst (list 10 (round (cadr x))(round (caddr x))) x ent)))
)
)
)
P/S : nick bạn làm mình nhớ VLTK quá ^^

Cám ơn bạn. Mình lập trình autolíp đã lâu nhưng kg nghĩ ra cú pháp lạ và hay như vậy. Có lẽ cái kiến thức cũ kỹ của mình đã lỗi thời rồi.
(Nick của mình của mình kg liên quan gì đến VLTK đâu ạ)
  • 0

#310 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 28 February 2011 - 08:14 AM

Mình muốn làm tròn tọa độ đỉnh của một polyline có sẵn trên bản vẽ về 2 số lẽ nhưng chưa biết cách nào. Bạn nào biết hướng dẫn cho mình hoặc chỉ mình trang nào đề cập vđ này. Mình tìm kg thấy. Cám ơn các bạn

Một yêu cầu khá là "ngộ" !


Chắc cũng k cần list point ra đâu bạn TRUNGNGAMY ạ.
Với LWPlolyline thì :

(defun c:test()
(defun round(x)(atof (rtos x 2 2)))
(foreach x (setq ent (entget (car(entsel))))
(if (= (car x) 10)
(entmod (setq ent(subst (list 10 (round (cadr x))(round (caddr x))) x ent)))
)
)
)
P/S : nick bạn làm mình nhớ VLTK quá ^^

Đại cao thủ xuất hiện.
Bái phục ! Bái phục !
  • 0

#311 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 28 February 2011 - 10:39 AM

Bác gia_bach đang đá xoáy em nhé ^^
@Bạn TRUNGNGAMY : mình chỉ replace thôi chứ có thấy gì lạ đâu hè ?
  • 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


#312 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 28 February 2011 - 03:28 PM

Một yêu cầu khá là "ngộ" !

Vđ này các bạn đã gặp và đã giúp rất nhiều anh em trắc địa rồi mà các bạn kg để ý đấy thôi. Trong CT in Hồ sơ kỹ thuật thửa đất do cadviet viết, thường tọa độ làm tròn đến 2 số lẽ (tức đơn vị cm). Nếu ta chỉ làm tròn trên tọa độ in ra bảng mà kg làm tròn ngay bản thân cái polyline gốc thì sẽ có sai lệch diện tích, vì dụ khi bạn kg có file mà phải nhập lại bảng tọa độ đó. Trong ngành địa chính cũng sd tọa độ đỉnh thửa đất đến cm thôi
  • 0

#313 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 28 February 2011 - 05:20 PM

Vđ này các bạn đã gặp và đã giúp rất nhiều anh em trắc địa rồi mà các bạn kg để ý đấy thôi. Trong CT in Hồ sơ kỹ thuật thửa đất do cadviet viết, thường tọa độ làm tròn đến 2 số lẽ (tức đơn vị cm). Nếu ta chỉ làm tròn trên tọa độ in ra bảng mà kg làm tròn ngay bản thân cái polyline gốc thì sẽ có sai lệch diện tích, vì dụ khi bạn kg có file mà phải nhập lại bảng tọa độ đó. Trong ngành địa chính cũng sd tọa độ đỉnh thửa đất đến cm thôi

hà hà, bây giờ thì mình đã hiểu. từ hôm đến giờ cứ thắc mắc mãi không hiểu bạn muốn làm điều đó vì mục đích gì :lol:
  • 0

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


#314 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 28 February 2011 - 09:07 PM

Các bác ơi cho e hỏi về bài toán này chút :
Chẳng là e muốn chia đôi 1/nhiều thằng Dim bằng 1 Line như hình vẽ bên dưới
Hình đã gửi
Ý tưởng là e định:
- Phá dim ra
- Lấy entget thằng chân dim dựa vào handle so với handle của entlast (text dim)
- Lấy inters của Line cắt với line chân dim này, rồi break nó thành 2 / hoặc vẽ lại 2 nửa đoạn thẳng chân dim
- Lại dựa vào handle để lấy entget của 2 đường thẳng vừa bị break ( bỏ nếu vẽ lại đường thẳng )
- Move các phần bên trái dịch sang trái, phải dịch sang phải, copy text sang bên thiếu

E thấy nó tối tăm và dài dòng quá, liệu tạo lại 2 nửa như thế có nhanh hơn không nhỉ?Hay dùng thủ thuật nào hay hơn ?
Mọi người góp ý hộ e với :(
P/S : nếu để nguyên Dim mà không phá ra, e cũng không tìm được 1 cách hiểu trực quan 2 điểm intersec của Dim và đường thẳng cắt. E mường tượng là nó cắt ở 2 điểm giao với "đường bao" tưởng tượng của block Dim, nhưng lạ là vì khi Line cắt thẳng đứng, tọa độ x của 2 điểm này lại khác nhau @@, mong các bác chỉ giúp.
  • 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


#315 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 28 February 2011 - 11:07 PM

Các bác ơi cho e hỏi về bài toán này chút :
Chẳng là e muốn chia đôi 1/nhiều thằng Dim bằng 1 Line như hình vẽ bên dưới
Hình đã gửi
Ý tưởng là e định:
- Phá dim ra
- Lấy entget thằng chân dim dựa vào handle so với handle của entlast (text dim)
- Lấy inters của Line cắt với line chân dim này, rồi break nó thành 2 / hoặc vẽ lại 2 nửa đoạn thẳng chân dim
- Lại dựa vào handle để lấy entget của 2 đường thẳng vừa bị break ( bỏ nếu vẽ lại đường thẳng )
- Move các phần bên trái dịch sang trái, phải dịch sang phải, copy text sang bên thiếu

E thấy nó tối tăm và dài dòng quá, liệu tạo lại 2 nửa như thế có nhanh hơn không nhỉ?Hay dùng thủ thuật nào hay hơn ?
Mọi người góp ý hộ e với :(
P/S : nếu để nguyên Dim mà không phá ra, e cũng không tìm được 1 cách hiểu trực quan 2 điểm intersec của Dim và đường thẳng cắt. E mường tượng là nó cắt ở 2 điểm giao với "đường bao" tưởng tượng của block Dim, nhưng lạ là vì khi Line cắt thẳng đứng, tọa độ x của 2 điểm này lại khác nhau @@, mong các bác chỉ giúp.

Có phải như thế này không: COPY DIM lên chính nó, sau đó TRIM mỗi DIM 1 lần về 2 phía của đường cắt?
  • 0

* 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.


#316 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 01 March 2011 - 07:36 AM

Các bác ơi cho e hỏi về bài toán này chút :
Chẳng là e muốn chia đôi 1/nhiều thằng Dim bằng 1 Line như hình vẽ bên dưới
Hình đã gửi
Ý tưởng là e định:
- Phá dim ra
- Lấy entget thằng chân dim dựa vào handle so với handle của entlast (text dim)
- Lấy inters của Line cắt với line chân dim này, rồi break nó thành 2 / hoặc vẽ lại 2 nửa đoạn thẳng chân dim
- Lại dựa vào handle để lấy entget của 2 đường thẳng vừa bị break ( bỏ nếu vẽ lại đường thẳng )
- Move các phần bên trái dịch sang trái, phải dịch sang phải, copy text sang bên thiếu

E thấy nó tối tăm và dài dòng quá, liệu tạo lại 2 nửa như thế có nhanh hơn không nhỉ?Hay dùng thủ thuật nào hay hơn ?
Mọi người góp ý hộ e với :(
P/S : nếu để nguyên Dim mà không phá ra, e cũng không tìm được 1 cách hiểu trực quan 2 điểm intersec của Dim và đường thẳng cắt. E mường tượng là nó cắt ở 2 điểm giao với "đường bao" tưởng tượng của block Dim, nhưng lạ là vì khi Line cắt thẳng đứng, tọa độ x của 2 điểm này lại khác nhau @@, mong các bác chỉ giúp.

ketxu post bài thế nào mà không thấy hình(image) ?!
Có mỗi con ếch-nhái gì đó làm sao góp ý.
  • 0

#317 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 01 March 2011 - 08:00 AM

Có phải như thế này không: COPY DIM lên chính nó, sau đó TRIM mỗi DIM 1 lần về 2 phía của đường cắt?

Mình cũng đã nghĩ đến phương án đó.Nói thì nhanh vậy thôi nhưng mình nghĩ vẫn sẽ phải mần tương đối nhiều bước để trim được :( Dim để nguyên mình không biết cách trim.Phá ra rồi trim thì lại đi theo trình tự như trên :(

ketxu post bài thế nào mà không thấy hình(image) ?!
Có mỗi con ếch-nhái gì đó làm sao góp ý.

Híc, sao e lại nhìn thấy rõ nhỉ.Chắc bọn Imageshack nó làm tiền e ^^ Các bác xem bằng hình bên dưới hộ e với nhé
Hình đã gửi
  • 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


#318 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 01 March 2011 - 08:53 AM

Mình cũng đã nghĩ đến phương án đó.Nói thì nhanh vậy thôi nhưng mình nghĩ vẫn sẽ phải mần tương đối nhiều bước để trim được :( Dim để nguyên mình không biết cách trim.Phá ra rồi trim thì lại đi theo trình tự như trên :(


Híc, sao e lại nhìn thấy rõ nhỉ.Chắc bọn Imageshack nó làm tiền e ^^ Các bác xem bằng hình bên dưới hộ e với nhé
Hình đã gửi

Imageshack đòi Login mới cho đọc file image.

Từ Cad 2008 có lệnh DIMBREAK cho phép break đuờng dimension nhưng k/quả chỉ hiển thị 1 giá trị TEXT.
  • 1

#319 hungcuong375

hungcuong375

    biết zoom

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

Đã gửi 07 May 2011 - 03:21 PM

Cảm ơn bác ssg nhiều lắm. Thú thật là em cũng mới biết đến Autolisp thời gian gần đây và cũng muốn học cho biết nhưng ko có sư phụ, đọc sách thì không hiểu. Chúc bác ssg và anh em cadviet.com mạnh khoẻ và công hiến cho diễn đàn với tinh thần "share is receive". Thân
  • 0

#320 lenhatanh

lenhatanh

    biết vẽ polygon

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

Đã gửi 08 June 2011 - 08:24 PM

Chào cả nhà, mình đang rất cần tư vấn về vấn đề liệu lisp có lệnh tìm giao điểm giữa mặt (3D Face)
va đường (LWpolyline có Z=/0) không ? mọi người gúp mình nhé.
(Mình đã nêu vấn đề này bên mục "Viết Lisp theo yêu cầu phần 2" mà không ai phản hồi cả, buồn quá) !
  • 0