Đến nội dung


Hình ảnh
- - - - -

[Hỏi] phương pháp chọn và lọc đối tượng theo điều kiện


  • Please log in to reply
21 replies to this topic

#1 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 21 December 2014 - 09:53 AM

Các bác cho em hỏi 1 chút.

Em có 1 Polyline 2D và 1 tập Text cao độ ở xung quanh Polyline đó.

Mục đích của em là Convert Polyline 2D đó sang 3D Polyline  với giá trị Z là lấy nội dung Text gần nhất với đỉnh Polyline và nằm trong bán kính cho phép nhập vào.

Bài toán này em làm được rồi, tuy nhiên về tốc độ là hơi chậm.

Thuật toán em là xét từng đỉnh Polyline, tính khoảng cách từ đỉnh tới các Text đó, Sort theo khoảng cách tăng dần, cắt lấy thằng đầu tiên và kiểm tra khoảng cách đó có nhỏ hơn bán kính nhập vào không? Nếu thỏa mãn thì lấy tọa độ X,Y của đỉnh và Z = nội dung Text thỏa mãn đó, không thì Z = 0. Sau đó em sẽ có 1 list tọa độ và vẽ Polyline 3D.

Tốc độ chậm là do phải tính khoảng cách từ  đỉnh tới tất cả các Text nên nó chậm.

Em hỏi là có cách nào không cần tính khoảng cách từ đỉnh tới tất cả các Text mà chỉ tính khoảng cách từ đỉnh tới các Text nằm trong bán kính nhập vào hay không?

Nếu xét theo kiểu Zoom Window thì nếu bản vẽ nặng zoom sẽ đơ và bị ảnh hưởng bởi cửa sổ Zoom.

Nhờ các bác cho em cách thức với ạ!

 

(defun C:CV3D (/ ss0 ss1 ss2 LtsObjPline  )
(setvar "CMDECHO" 0)
(Alert (strcat "\nQu\U+00E9t ch\U+1ECDn Text v\U+00E0 Polyline : "))
(setq ss0 (ssget (list (cons 0 "TEXT,LWPOLYLINE"))))
(setq LtsText (vl-remove nil (mapcar '(lambda(y) (if (= (acet-dxf 0 (entget y)) "TEXT") y nil)) (acet-ss-to-list ss0))))
(setq ss1 (acet-ss-to-list (ChonTextSo (acet-list-to-ss LtsText))))
(setq ss2 (vl-sort (vl-sort ss1 '(lambda(x y) (< (car (TD:Text-Base x)) (car (TD:Text-Base y))))) '(lambda(x y) (< (cadr (TD:Text-Base x)) (cadr (TD:Text-Base y))))))
  
(setq LtsObjPline (vl-remove nil (mapcar '(lambda(y) (if (= (acet-dxf 0 (entget y)) "LWPOLYLINE") y nil)) (acet-ss-to-list ss0))))
  

(or *fz* (setq *fz* 0.5))
(setq fz (getreal (strcat "\nNh\U+1EADp b\U+00E1n k\U+00EDnh Text g\U+1EA7n nh\U+1EA5t t\U+1EDBi \U+0111\U+1EC9nh Polyline <"
		  (rtos *fz* 2 2)
		 "> :"
	  )
 )
)
(if (not fz) (setq fz *fz*) (setq *fz* fz))
(mapcar '(lambda (x) (CV1PL3D x ss2 fz)) LtsObjPline)
(princ)
)



(defun CV1PL3D (ObjPline LtsEnameText fz /  LtsVertext Lts1 Pnt_i i P1  )
(setq LtsVertext (acet-geom-vertex-list ObjPline))
(setq Lts1 (list))
(setq Pnt_i (list))
(setq i 0)
(repeat (length LtsVertext)
	(progn
		(setq P1 (nth i LtsVertext))
	  	(setq Pnt_i (TGN P1 LtsEnameText fz))
		(setq Lts1 (append Lts1 (list Pnt_i)))
	)
(setq i (+ i 1))
)
(entdel ObjPline)
(MakePolyline3D Lts1)
)

(defun TGN ( Pnt ssText fz /  P1  EnameTGN   )
(setq P1 (list (car Pnt) (cadr Pnt)))
(setq EnameTGN  (car (vl-sort ssText '(lambda(x y) (< (distance (list (car (TD:Text-Base x)) (cadr (TD:Text-Base x))) P1) (distance (list (car (TD:Text-Base y)) (cadr (TD:Text-Base y))) P1))))))
(if (< (distance (list (car (TD:Text-Base EnameTGN)) (cadr (TD:Text-Base EnameTGN))) P1) fz )
    (setq PntPL (list (car Pnt) (cadr Pnt) (atof (cdr (assoc 1 (entget EnameTGN))))))
    (setq PntPL (list (car Pnt) (cadr Pnt) 0))
)
PntPL
)

(defun TD:Text-Base (ent)
  (setq Ma10  (cdr (assoc 10 (entget ent))))
  (setq Ma11  (cdr (assoc 11 (entget ent))))
  (setq X11 (car Ma11))
  (setq Ma71  (cdr (assoc 71 (entget ent))))
  (setq Ma72  (cdr (assoc 72 (entget ent))))
  (if (or (and (= Ma71 0) (= Ma72 0) (= X11 0))
	  (and (= Ma71 0) (= Ma72 3) )
	  (and (= Ma71 0) (= Ma72 5) )
      )
    Ma10
    Ma11
   )
)


(defun MakePolyline3D (vtcs)
  (entmake
    (list
    '(0 . "POLYLINE")
    '(66 . 1)
    '(70 . 8)
    )
  )
  (foreach vtx vtcs
    (entmake
      (list
      '(0 . "VERTEX")
      (cons 10 vtx)
      '(70 . 32)
      )
    )
  )
  (entmake '((0 . "SEQEND")))
)

(defun ChonTextSo (ss / i ent str ss1) 
    (progn
      (setq i	0
	    ss1	(ssadd)
      )
      (repeat (sslength ss)
	(setq ent (ssname ss i)
	      str (cdr(assoc 1 (entget ent)))
	      i	  (+ 1 i)
	)
	(if (distof str 2)
	  (ssadd ent ss1)
	)
      )
      (if (> (sslength ss1) 0)
	ss1
      )      
    )
)

 


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#2 nhoclangbat

nhoclangbat

    Edu level: li10

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

Đã gửi 21 December 2014 - 10:40 AM

 - hi theo ngu kíến của nhoc thì có thể dung vòng lập xét từng đỉnh với tập text, dxf11 của text nào nhỏ hơn or = bk nhập vào thì nhận text đó ^^

p/s: còn nếu có nhiều text nằm trong khoảng đó thì chưa nghĩ ra kaka 


  • 0
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#3 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 21 December 2014 - 10:56 AM

Theo mình thì bạn có thể bổ sung thuật toán như này có khi nhanh hơn được tí: sau khi tìm được text gần nhất với đỉnh polyline bạn dùng hàm ssdel loại bỏ luôn text đó ra khỏi tập text, như thế thì càng về cuối số lượng text phải duyệt càng ít đi.
  • 0

#4 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 21 December 2014 - 10:56 AM

 - hi theo ngu kíến của nhoc thì có thể dung vòng lập xét từng đỉnh với tập text, dxf11 của text nào nhỏ hơn or = bk nhập vào thì nhận text đó ^^

p/s: còn nếu có nhiều text nằm trong khoảng đó thì chưa nghĩ ra kaka 

Như em thì vẫn là xét tất cả các Text  trong bản vẽ. Anh nghĩ ra cách là xét theo cửa sổ window từng đỉnh với bán kính


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#5 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 21 December 2014 - 10:58 AM

Theo mình thì bạn có thể bổ sung thuật toán như này có khi nhanh hơn được tí: sau khi tìm được text gần nhất với đỉnh polyline bạn dùng hàm loại bỏ luôn text đó ra khỏi tập text, như thế thì càng về cuối số lượng text phải duyệt càng ít đi.

Mình đã làm cách đó rồi. Có nhanh hơn 1 chút. Nhưng không ổn vì Text có hàng chục nghìn Text


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#6 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 21 December 2014 - 10:59 AM

Phương án này khả dĩ:

- Zoom bao hết text và pline cần xét.

- Duyệt qua từng đỉnh pt của pline.

- Tại mỗi pt tạo 1 tập chọn các text kiểu (ssget "CP" pt_list), trong đó pt_list là list các điểm của đường tròn tâm pt bán kính R.

Tùy mức độ chính xác có thể chia circle này thành 1 đa giác đều n cạnh.

- Sort để chọn text gần nhất (nếu có).

- Thanhduan làm tiếp.


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


#7 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 21 December 2014 - 11:07 AM

Phương án này khả dĩ:

- Zoom bao hết text và pline cần xét.

- Duyệt qua từng đỉnh pt của pline.

- Tại mỗi pt tạo 1 tập chọn các text kiểu (ssget "CP" pt_list), trong đó pt_list là list các điểm của đường tròn tâm pt bán kính R.

Tùy mức độ chính xác có thể chia circle này thành 1 đa giác đều n cạnh.

- Sort để chọn text gần nhất (nếu có).

- Thanhduan làm tiếp.

Đúng là em đang theo cách này bác Hạ ạ!

Giá như có 1 thuật toán lọc tập điểm một cách tối ưu nhất thì hay.


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#8 hiepttr

hiepttr

    Edu level: li10

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

Đã gửi 21 December 2014 - 11:35 AM

Đúng là em đang theo cách này bác Hạ ạ!

Giá như có 1 thuật toán lọc tập điểm một cách tối ưu nhất thì hay.

Ý của bác là thế nào ?!
Nếu sợ bỏ sót text do cái "mức độ chính xác" thì bác duyệt luôn cái hình vuông cạnh = 2*R có tâm nằn ở mỗi đỉnh PL


  • 0

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#9 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 21 December 2014 - 11:37 AM

Ý của bác là thế nào ?!
Nếu sợ bỏ sót text do cái "mức độ chính xác" thì bác duyệt luôn cái hình vuông cạnh = 2*R có tâm nằn ở mỗi đỉnh PL

Vâng, em đang làm theo  cách  ấy


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#10 nhoclangbat

nhoclangbat

    Edu level: li10

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

Đã gửi 21 December 2014 - 12:24 PM

- hi cách dùng ssget như anh Ha nhoc cũng mới xài trong lsp nhoc như khác anh Duan, anh Duan chọn text để lấy còn của nhoc chọn text để né cái khác ^^ 


  • 0
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#11 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 21 December 2014 - 12:44 PM

Anh chọn theo cái này

(defun PntVongtron (Pnt R / L1 i)
(setq L1 (list))
(setq L2 (list))
(setq i 0)
(repeat 10
	(setq L1 (polar Pnt (/ (* i 36 pi) 180) R))
  	(setq L2 (append L2 (list L1)))
  	(setq i (1+ i))

)
L2
)

  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#12 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 21 December 2014 - 12:54 PM

Nhờ Nhoclangbat kiểm tra dùm anh xem sai chỗ nào?

(defun C:CVPL(/ ObjPline  minp maxp pl Lts1 Pnt_i Pnt LtsVertext P1 P1a P1b LtsText ss1 ss2 )
(setvar "CMDECHO" 0)
(defun *error* ( msg )
		(if Olmode (setvar 'osmode Olmode))
		(if (not (member msg '("*BREAK,*CANCEL*,*EXIT*")))
		    (princ (strcat "\nError: " msg))
		)
		(princ)
)
(setq Olmode (getvar "osmode"));;;LUU CHE DO BAT DIEM OSNAP
(setvar "OSMODE" 0)
(setq ObjPline (car (entsel "\nChon Pline: ")))
(setq pl (vlax-ename->vla-object ObjPline))
(vla-getboundingbox pl 'minp 'maxp)
(setq minp (safearray-value minp))
(setq maxp (safearray-value maxp))
(command "Zoom" "W" minp maxp)

(or *fz* (setq *fz* 0.5))
(setq fz (getreal (strcat "\nNh\U+1EADp b\U+00E1n k\U+00EDnh Text g\U+1EA7n nh\U+1EA5t t\U+1EDBi \U+0111\U+1EC9nh Polyline <"
		  (rtos *fz* 2 2)
		 "> :"
	  )
 )
)
(if (not fz) (setq fz *fz*) (setq *fz* fz))
  
(setq Lts1 (list))
(setq LtsVertext (acet-geom-vertex-list ObjPline))
(foreach Pnt LtsVertext
  	(setq Pnt_i (TGN1 Pnt 1))
	(setq Lts1 (append Lts1 (list Pnt_i)))
)
(entdel ObjPline)
(MakePolyline3D Lts1)
(setvar "OSMODE" Olmode)
(princ)
)


(defun TGN1 (Pnt fz /  P1 ss1 EnameTGN LtsText) 
(setq P1 (list (car Pnt) (cadr Pnt)))
(setq ss1 (ssget "CP"  (PntVongtron P1 fz) (list (cons 0 "TEXT"))))
(setq LtsText (acet-ss-to-list (ChonTextSo  ss1)))
(setq EnameTGN  (car (vl-sort LtsText '(lambda(x y) (< (distance (list (car (TD:Text-Base x)) (cadr (TD:Text-Base x))) P1) (distance (list (car (TD:Text-Base y)) (cadr (TD:Text-Base y))) P1))))))
(if (< (distance (list (car (TD:Text-Base EnameTGN)) (cadr (TD:Text-Base EnameTGN))) P1) fz )
    (setq PntPL (list (car Pnt) (cadr Pnt) (atof (cdr (assoc 1 (entget EnameTGN))))))
    (setq PntPL (list (car Pnt) (cadr Pnt) 0))
)
PntPL
)



(defun PntVongtron (Pnt R / L1 i)
(setq L1 (list))
(setq L2 (list))
(setq i 0)
(repeat 10
	(setq L1 (polar Pnt (/ (* i 36 pi) 180) R))
  	(setq L2 (append L2 (list L1)))
  	(setq i (1+ i))

)
L2
)


(defun TD:Text-Base (ent)
  (setq Ma10  (cdr (assoc 10 (entget ent))))
  (setq Ma11  (cdr (assoc 11 (entget ent))))
  (setq X11 (car Ma11))
  (setq Ma71  (cdr (assoc 71 (entget ent))))
  (setq Ma72  (cdr (assoc 72 (entget ent))))
  (if (or (and (= Ma71 0) (= Ma72 0) (= X11 0))
	  (and (= Ma71 0) (= Ma72 3) )
	  (and (= Ma71 0) (= Ma72 5) )
      )
    Ma10
    Ma11
   )
)


(defun MakePolyline3D (vtcs)
  (entmake
    (list
    '(0 . "POLYLINE")
    '(66 . 1)
    '(70 . 8)
    )
  )
  (foreach vtx vtcs
    (entmake
      (list
      '(0 . "VERTEX")
      (cons 10 vtx)
      '(70 . 32)
      )
    )
  )
  (entmake '((0 . "SEQEND")))
)

(defun ChonTextSo (ss / i ent str ss1) 
    (progn
      (setq i	0
	    ss1	(ssadd)
      )
      (repeat (sslength ss)
	(setq ent (ssname ss i)
	      str (cdr(assoc 1 (entget ent)))
	      i	  (+ 1 i)
	)
	(if (distof str 2)
	  (ssadd ent ss1)
	)
      )
      (if (> (sslength ss1) 0)
	ss1
      )      
    )
)

Em vẽ 1Pline đi qua 1 số Text dạng số nhé


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#13 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 21 December 2014 - 01:00 PM

- Nhìn code a thì thấy :

+ Đống setq ss ban đầu : Liên tục cởi áo rồi mặc áo rồi lại cởi áo với acet-ss-to-list

+ Các hàm vl-sort lồng nhau lại càng tệ, làm cho 1 list phải duyệt rất nhiều lần

+ Phần tìm Text bằng cách sort : Có những thằng cách pt 1 khoảng lớn hơn R (thường là rất nhiều) nhưng hàm vẫn hì hục sort

+ Sort xong cũng không loại bỏ nó ra khỏi list, dẫn tới càng về sau khối lượng tính toán vô nghĩa càng nhiều, trong khi thực tế ngược lại. Với càng nhiều đtuong như a nói thì việc này càng ý nghĩa

+ Tham vọng quét để làm hàng loạt Pline, Text dẫn tới việc đỉnh ở Pline này phải xét với text ở tận Pline đằng xa

 

- Sơ bộ với code cũ a có thể :

+ Phân chia ssText và Pline thành các nhóm theo Boundingbox của Pline + offset R. Khi xử lý thì làm từng cặp một

+ Sử dụng acet-ss-to-list ở hàm chính rồi thì hàm con k duyệt lại, tránh trùng lặp

+ Khi duyệt qua từng đỉnh Pline để tìm text gần nhất thì nên dùng Foreach để lấy điểm chèn cách Pt 1 khoảng nhỏ hơn R và nhỏ hơn giá trị nhỏ hơn R nhỏ nhất trước đó (nổi bong bóng)

 

 Khoảng cách thỏa mãn đó như là 

(apply 'min (mapcar '(lambda(x)(distance Điểm_chèn_text p)) List_Text)) 

 

+ Loại bỏ ngay Text gần nhất khỏi list sau khi tìm ra nó

 

 - Với các thuật toán mọi người góp ý ket k có góp ý j do chưa thâý code. Việc dùng zoom window với độ chính xác bao nhiêu tùy người code. Nó cũng giống việc phân chia vùng xử lý đã bàn luận. 

Việc này dù có nháy nháy nhưng chắc tốc độ sẽ tốt hơn, vì k phải dò hết. A nên ẩn những thằng k thuộc 2  loại đối tượng mình xử lý đi thì sẽ nhanh hơn nữa

Gluck ^^

 

 

P/s thêm : code a viết nhìn khá rối vì đặt tên nó sao sao đó. 


  • 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


#14 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 21 December 2014 - 01:11 PM

- Nhìn code a thì thấy :

+ Đống setq ss ban đầu : Liên tục cởi áo rồi mặc áo rồi lại cởi áo với acet-ss-to-list

+ Các hàm vl-sort lồng nhau lại càng tệ, làm cho 1 list phải duyệt rất nhiều lần

+ Phần tìm Text bằng cách sort : Có những thằng cách pt 1 khoảng lớn hơn R (thường là rất nhiều) nhưng hàm vẫn hì hục sort

+ Sort xong cũng không loại bỏ nó ra khỏi list, dẫn tới càng về sau khối lượng tính toán vô nghĩa càng nhiều, trong khi thực tế ngược lại. Với càng nhiều đtuong như a nói thì việc này càng ý nghĩa

+ Tham vọng quét để làm hàng loạt Pline, Text dẫn tới việc đỉnh ở Pline này phải xét với text ở tận Pline đằng xa

 

- Sơ bộ với code cũ a có thể :

+ Phân chia ssText và Pline thành các nhóm theo Boundingbox của Pline + offset R. Khi xử lý thì làm từng cặp một

+ Sử dụng acet-ss-to-list ở hàm chính rồi thì hàm con k duyệt lại, tránh trùng lặp

+ Khi duyệt qua từng đỉnh Pline để tìm text gần nhất thì nên dùng Foreach để lấy điểm chèn cách Pt 1 khoảng nhỏ hơn R và nhỏ hơn giá trị nhỏ hơn R nhỏ nhất trước đó (nổi bong bóng)

 

 Khoảng cách thỏa mãn đó như là 

(apply 'min (mapcar '(lambda(x)(distance Điểm_chèn_text p)) List_Text)) 

 

+ Loại bỏ ngay Text gần nhất khỏi list sau khi tìm ra nó

 

 - Với các thuật toán mọi người góp ý ket k có góp ý j do chưa thâý code. Việc dùng zoom window với độ chính xác bao nhiêu tùy người code. Nó cũng giống việc phân chia vùng xử lý đã bàn luận. 

Việc này dù có nháy nháy nhưng chắc tốc độ sẽ tốt hơn, vì k phải dò hết. A nên ẩn những thằng k thuộc 2  loại đối tượng mình xử lý đi thì sẽ nhanh hơn nữa

Gluck ^^

 

 

P/s thêm : code a viết nhìn khá rối vì đặt tên nó sao sao đó. 

Ok, cảm ơn em Ketxu. Anh đã bổ sung.

Nhờ em có thể kiểm tra dùm anh sao đoạn nó lại báo lỗi nhỉ? Điều anh anh ko hiểu luôn.

(setq LtsVertext (acet-geom-vertex-list ObjPline))
(foreach Pnt LtsVertext
  	(setq Pnt_i (TGN1 Pnt 1))
	(setq Lts1 (append Lts1 (list Pnt_i)))
)

Cảm ơn em


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#15 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 21 December 2014 - 01:55 PM

Thôi xong! Đã ok rồi. ^^


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#16 nhoclangbat

nhoclangbat

    Edu level: li10

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

Đã gửi 21 December 2014 - 02:17 PM

- hi nhoc thử binh lại theo cách này bớt đc 2 hàm pntvongtron với tgn1 , chạy thử thấy cũng ra đc ^^, mà ko pit với khối lượng lớn thì ra sao ^^\

(defun C:CVPL(/ ObjPline  minp maxp pl Lts1 Pnt_i Pnt LtsVertext P1 P1a P1b LtsText ss1 ss2 )
(setvar "CMDECHO" 0)
(defun *error* ( msg )
		(if Olmode (setvar 'osmode Olmode))
		(if (not (member msg '("*BREAK,*CANCEL*,*EXIT*")))
		    (princ (strcat "\nError: " msg))
		)
		(princ)
)
(setq Olmode (getvar "osmode"));;;LUU CHE DO BAT DIEM OSNAP
(setvar "OSMODE" 0)
(if (setq ObjPline (car (entsel "\nChon Pline: ")))
(progn
;(setq pl (vlax-ename->vla-object ObjPline))
;(vla-getboundingbox pl 'minp 'maxp)
;(setq minp (safearray-value minp))
;(setq maxp (safearray-value maxp))
;(command "Zoom" "W" minp maxp)

(or *fz* (setq *fz* 0.5))
(setq fz (getreal (strcat "\nNh\U+1EADp b\U+00E1n k\U+00EDnh Text g\U+1EA7n nh\U+1EA5t t\U+1EDBi \U+0111\U+1EC9nh Polyline <"
		  (rtos *fz* 2 2)
		 "> :"
	  )
 )
)
(if (not fz) (setq fz *fz*) (setq *fz* fz))
  
;(setq Lts1 (list))
(setq LtsVertext (acet-geom-vertex-list ObjPline))
(foreach Pnt LtsVertext
(setq pc (mapcar '+ Pnt (list  (- fz) (- fz) 0.0)))
(setq pd (mapcar '+ Pnt (list  fz  fz 0.0)))
(setq ppt (polar pc (/ pi 2) (- (cadr pd) (cadr pc))))
(setq ppd (polar pc 0 (- (car pd) (car pc))))
(setq kk (ssget "_CP"  (list pc ppt pd ppd) (list (cons 0 "TEXT"))))
(if kk
  (progn 
(setq LtsText (acet-ss-to-list (ChonTextSo  kk)))
;===========================================================
(setq EnameTGN  (car (vl-sort LtsText '(lambda(x y) (< (distance (list (car (TD:Text-Base x)) (cadr (TD:Text-Base x))) Pnt) (distance (list (car (TD:Text-Base y)) (cadr (TD:Text-Base y))) Pnt))))))
(if (< (distance (list (car (TD:Text-Base EnameTGN)) (cadr (TD:Text-Base EnameTGN))) Pnt) fz )
    (setq PntPL (list (car Pnt) (cadr Pnt) (atof (cdr (assoc 1 (entget EnameTGN))))))
    (setq PntPL (list (car Pnt) (cadr Pnt) 0))
)
;======================================================
  	;(setq Pnt_i (TGN1 Pnt 1))
	(setq Lts1 (append Lts1 (list PntPL)))
)
)
)
Lts1
(entdel ObjPline)
(MakePolyline3D Lts1)
); end progn objpline
) ;end if 
(setvar "OSMODE" Olmode)
(princ)
)




(defun TD:Text-Base (ent)
  (setq Ma10  (cdr (assoc 10 (entget ent))))
  (setq Ma11  (cdr (assoc 11 (entget ent))))
  (setq X11 (car Ma11))
  (setq Ma71  (cdr (assoc 71 (entget ent))))
  (setq Ma72  (cdr (assoc 72 (entget ent))))
  (if (or (and (= Ma71 0) (= Ma72 0) (= X11 0))
	  (and (= Ma71 0) (= Ma72 3) )
	  (and (= Ma71 0) (= Ma72 5) )
      )
    Ma10
    Ma11
   )
)


(defun MakePolyline3D (vtcs)
  (entmake
    (list
    '(0 . "POLYLINE")
    '(66 . 1)
    '(70 . 8)
    )
  )
  (foreach vtx vtcs
    (entmake
      (list
      '(0 . "VERTEX")
      (cons 10 vtx)
      '(70 . 32)
      )
    )
  )
  (entmake '((0 . "SEQEND")))
)

(defun ChonTextSo (ss / i ent str ss1) 
    (progn
      (setq i	0
	    ss1	(ssadd)
      )
      (repeat (sslength ss)
	(setq ent (ssname ss i)
	      str (cdr(assoc 1 (entget ent)))
	      i	  (+ 1 i)
	)
	(if (distof str 2)
	  (ssadd ent ss1)
	)
      )
      (if (> (sslength ss1) 0)
	ss1
      )      
    )
)

  • 0
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#17 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 21 December 2014 - 02:32 PM

Anh đã nâng cấp và nó chạy ầm ầm em ạ! :D

Mục đích của anh là chạy mặt cắt. :D


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#18 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 21 December 2014 - 02:34 PM

Anh chọn theo bán kính với số lượng khoảng 10 điểm thôi. Nó chạy tương đối ổn so với cách trước.

Cảm ơn em, trong lúc chờ anh đã tìm ra dc chỗ nhầm.


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#19 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 22 December 2014 - 10:35 AM

Không có file để test, nhưng thấy chỗ trong hàm TGN1 là sai:

Nếu có LtsText thì lấy z ở text gần nhất (dùng hàm min sẽ nhanh hơn nhiều so với sort), nếu không thì z=0

Các text số nếu có thì chắc chắn có khoảng cách < fz

Nếu không có LtsText thì hàm distance sẽ lỗi


  • 1

#20 tien2005

tien2005

    biết lệnh properties

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

Đã gửi 22 December 2014 - 12:40 PM

Bạn vẽ mặt cắt mà không nội suy cao độ tại các đỉnh pline thì sẽ có sai số rất lớn trong trường hợp độ dốc địa hình lớn, mật độ điểm đo quá thưa


  • 1