Đến nội dung


Hình ảnh
- - - - -

[Nhờ Viết Lisp] Dim Nhanh Giữa Các Line (Hoặc Pl)


  • Please log in to reply
9 replies to this topic

#1 khanh phong

khanh phong

    biết pan

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

Đã gửi 22 November 2016 - 09:27 PM

 Nhờ các anh chị giúp em về yêu cầu sau:

 - Em có 4 line: line 1,2,3,4 và 1 đường giống song song line 1. Em cần dim nhanh kích thước cho line 1 vuông góc line 2, line 1 vuông góc line 3, line 1 vuông góc line 4. Và text của 3 kích thước dim ra được xếp trên đường giống đã offset sẵn.

Các anh chị xem thêm file ảnh cho rõ.

 

http://YEUCAU_zpsoinf7fvu.jpg

 

Cám ơn nhiều.

 


  • -1

#2 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 23 November 2016 - 09:04 AM

Câu hỏi của bạn hoặc là mâu thuẫn hoặc thiếu số liệu. Bạn nhìn hình của bạn xem có bao nhiêu đáp án ?
  • 1

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


#3 khanh phong

khanh phong

    biết pan

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

Đã gửi 23 November 2016 - 03:50 PM

Mình cần lisp dim vuông góc line 1 với 3 line còn lại, vì làm job mình phải dim như vậy rất nhiều, nên nhờ diển đàn cadviet giúp.

Vì mình mới học viết lisp nên mình chỉ biết cách làm thủ công như bên dưới. Anh chị có chỉnh giúp em số point A1,A2,A3 thành biến số n point.

(defun c:FDD()
(setq cmdecho 0)
(setq osmode 0)
(WHILE
(setq A1 (getpoint "\nDiem 1 càn dim: ")
	A2 (getpoint "\nDiem 2 càn dim: ")
	A3 (getpoint "\nDiem 1 càn dim: ")
	B (getpoint "\nDuòng càn vuông góc: ")
	C (getpoint "\nVi trí dat TEXT1: ")
	D (getpoint "\nVi trí dat TEXT2: ")
	E (getpoint "\nVi trí dat TEXT3: "))
(command "_.dimaligned" A1 "PER" B C)
(command "_.dimaligned" A2 "PER" B D)
(command "_.dimaligned" A3 "PER" B E))
(princ)
)

  • 0

#4 khanh phong

khanh phong

    biết pan

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

Đã gửi 24 November 2016 - 06:53 PM

Em mới làm quen với lisp nên mong được mọi người giúp


  • 0

#5 Bee

Bee

    biết lệnh array

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

Đã gửi 24 November 2016 - 09:00 PM

Em mới làm quen với lisp nên mong được mọi người giúp

Thử Lisp này nhé.

https://youtu.be/WIg8NEVBasg

(defun c:test ()
  (setq lst nil)
  (setq old (getvar "DIMJUST"))
  (if (setq ss (ssget '((0 . "LINE"))))
    (progn
      (setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
      (setq
	lst (vl-sort lst
		     '(lambda (e1 e2)
			(> (if (< (cadr (cdr (assoc 10 (entget e1))))
				  (cadr (cdr (assoc 11 (entget e1))))
			       )
			     (cadr (cdr (assoc 10 (entget e1))))
			     (cadr (cdr (assoc 11 (entget e1))))
			   )		;if e1
			   (if (< (cadr (cdr (assoc 10 (entget e2))))
				  (cadr (cdr (assoc 11 (entget e2))))
			       )
			     (cadr (cdr (assoc 10 (entget e2))))
			     (cadr (cdr (assoc 11 (entget e2))))
			   )		;if e2
			)
		      )
	    )
      )					;setq
      (setq pt (polar (cdr (assoc 10 (entget (car lst))))
		      (angle (cdr (assoc 10 (entget (car lst))))
			     (cdr (assoc 11 (entget (car lst))))
		      )
		      (/ (distance (cdr (assoc 10 (entget (car lst))))
				   (cdr (assoc 11 (entget (car lst))))
			 )
			 2
		      )
	       )
      )
      (setvar "DIMJUST" 1)
      (command "DIMALIGNED"
	       pt
	       "_per"
	       (cdr (assoc 11 (entget (cadr lst))))
	       "_none"
	       pt
      )
      (setq n 2)
      (command "DIMBASELINE")
      (repeat (- (length lst) 2)
	(command "_per" (cdr (assoc 11 (entget (nth n lst)))))
	(setq n (1+ n))
      )
      (command "" "")
    )					;progn then
    (princ "\nBan da khong chon LINE.")
  )
  (setvar "DIMJUST" old)
  (princ)
)

  • 1

#6 khanh phong

khanh phong

    biết pan

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

Đã gửi 25 November 2016 - 09:20 PM

Cám ơn anh Bee nhiều, lisp của anh gần như giải quyết được vấn đề của mình, chỉ có điều các text dim sắp xếp không theo được 1 line.

Hiện tại mình sử dụng lisp của anh, nhưng phải move text về thẳng hàng. Cám ơn anh nhiều


  • 0

#7 Bee

Bee

    biết lệnh array

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

Đã gửi 26 November 2016 - 08:00 PM

Cám ơn anh Bee nhiều, lisp của anh gần như giải quyết được vấn đề của mình, chỉ có điều các text dim sắp xếp không theo được 1 line.

Hiện tại mình sử dụng lisp của anh, nhưng phải move text về thẳng hàng. Cám ơn anh nhiều

Xem cái này sắp xếp thế nào nhé. ^_^

(defun c:test (/ lst old old_osm ss pt lst_dim n p11n)
  (setq lst nil _ang nil)
  (setq old (getvar "DIMJUST"))
  (setq old_osm (getvar 'osmode))
  (if (setq ss (ssget '((0 . "LINE"))))
    (progn
      (command "_zoom" "obj" ss "")
      (setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
      (setq
	lst (vl-sort lst
		     '(lambda (e1 e2)
			(> (if (< (cadr (cdr (assoc 10 (entget e1))))
				  (cadr (cdr (assoc 11 (entget e1))))
			       )
			     (cadr (cdr (assoc 10 (entget e1))))
			     (cadr (cdr (assoc 11 (entget e1))))
			   )		;if e1
			   (if (< (cadr (cdr (assoc 10 (entget e2))))
				  (cadr (cdr (assoc 11 (entget e2))))
			       )
			     (cadr (cdr (assoc 10 (entget e2))))
			     (cadr (cdr (assoc 11 (entget e2))))
			   )		;if e2
			)
		      )
	    )
      )					;setq

      (setq pt (polar (cdr (assoc 10 (entget (car lst))))
		      (angle (cdr (assoc 10 (entget (car lst))))
			     (cdr (assoc 11 (entget (car lst))))
		      )
		      (/ (distance (cdr (assoc 10 (entget (car lst))))
				   (cdr (assoc 11 (entget (car lst))))
			 )
			 2
		      )
	       )
      )
      (setvar "DIMJUST" 1)
      (command "DIMUPT" "OFF")
      (command "DIMALIGNED"
	       pt
	       "_per"
	       (cdr (assoc 11 (entget (cadr lst))))
	       "_none"
	       pt
      )
      (setq lst_dim nil)
      (setq lst_dim (cons (entlast) lst_dim))
      (setq n 2)
      (command "DIMBASELINE")
      (repeat (- (length lst) 2)
	(command "_per" (cdr (assoc 11 (entget (nth n lst)))))
	(setq lst_dim (cons (entlast) lst_dim))
	(setq n (1+ n))
      )
      (command "" "")
      (setvar 'osmode 0)      
      (if (lm:clockwise-p
	    (vlax-get (vlax-ename->vla-object (car lst_dim))
		      'textposition
	    )
	    (vlax-get (vlax-ename->vla-object (car lst))
		      'startpoint
	    )
	    (vlax-get (vlax-ename->vla-object (car lst))
		      'endpoint
	    )
	  )
	(setq _ang (+ pi (txt_angle (car lst_dim))))
	(setq _ang (- pi (txt_angle (car lst_dim))))
      )					;if
      (mapcar
	'(lambda (obj)

	   (setq p11n (polar (vlax-get (vlax-ename->vla-object obj)
				       'textposition
			     )
			     _ang
			     (* (getvar 'dimtxt) 10.)
		      )
	   )				;setq
	   (vlax-put (vlax-ename->vla-object obj) 'textposition p11n)
	 )
	lst_dim
      )
    )					;progn then
    (princ "\nBan da khong chon LINE.")
  )					;if
  (command "_zoom" "P")
  (setvar "DIMJUST" old)
  (setvar "OSMODE" old_osm)
  (princ)
)
(defun txt_angle (ename / blkent entdata _angle)
  (if
    (and
      (= (cdr (assoc 0 (setq entdata (entget ename))))
	 "DIMENSION"
      )
      (setq blkent (tblobjname "block" (cdr (assoc 2 entdata))))
    )
     (while (setq blkent (entnext blkent))
       (if (= (cdr (assoc 0 (setq entdata (entget blkent)))) "MTEXT")
	 (setq _angle (cdr (assoc 50 (entget blkent))))
       )
     )
  )
  _angle
)
(defun lm:clockwise-p (p1 p2 p3)
  ((lambda (n) (< (car (trans p2 0 n)) (car (trans p1 0 n))))
    (mapcar '- p1 p3)
  )
)
(princ)


  • 1

#8 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 29 November 2016 - 07:19 PM

 

Xem cái này sắp xếp thế nào nhé. ^_^

(defun c:test (/ lst old old_osm ss pt lst_dim n p11n)
  (setq lst nil _ang nil)
  (setq old (getvar "DIMJUST"))
  (setq old_osm (getvar 'osmode))
  (if (setq ss (ssget '((0 . "LINE"))))
    (progn
      (command "_zoom" "obj" ss "")
      (setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
      (setq
	lst (vl-sort lst
		     '(lambda (e1 e2)
			(> (if (< (cadr (cdr (assoc 10 (entget e1))))
				  (cadr (cdr (assoc 11 (entget e1))))
			       )
			     (cadr (cdr (assoc 10 (entget e1))))
			     (cadr (cdr (assoc 11 (entget e1))))
			   )		;if e1
			   (if (< (cadr (cdr (assoc 10 (entget e2))))
				  (cadr (cdr (assoc 11 (entget e2))))
			       )
			     (cadr (cdr (assoc 10 (entget e2))))
			     (cadr (cdr (assoc 11 (entget e2))))
			   )		;if e2
			)
		      )
	    )
      )					;setq

      (setq pt (polar (cdr (assoc 10 (entget (car lst))))
		      (angle (cdr (assoc 10 (entget (car lst))))
			     (cdr (assoc 11 (entget (car lst))))
		      )
		      (/ (distance (cdr (assoc 10 (entget (car lst))))
				   (cdr (assoc 11 (entget (car lst))))
			 )
			 2
		      )
	       )
      )
      (setvar "DIMJUST" 1)
      (command "DIMUPT" "OFF")
      (command "DIMALIGNED"
	       pt
	       "_per"
	       (cdr (assoc 11 (entget (cadr lst))))
	       "_none"
	       pt
      )
      (setq lst_dim nil)
      (setq lst_dim (cons (entlast) lst_dim))
      (setq n 2)
      (command "DIMBASELINE")
      (repeat (- (length lst) 2)
	(command "_per" (cdr (assoc 11 (entget (nth n lst)))))
	(setq lst_dim (cons (entlast) lst_dim))
	(setq n (1+ n))
      )
      (command "" "")
      (setvar 'osmode 0)      
      (if (lm:clockwise-p
	    (vlax-get (vlax-ename->vla-object (car lst_dim))
		      'textposition
	    )
	    (vlax-get (vlax-ename->vla-object (car lst))
		      'startpoint
	    )
	    (vlax-get (vlax-ename->vla-object (car lst))
		      'endpoint
	    )
	  )
	(setq _ang (+ pi (txt_angle (car lst_dim))))
	(setq _ang (- pi (txt_angle (car lst_dim))))
      )					;if
      (mapcar
	'(lambda (obj)

	   (setq p11n (polar (vlax-get (vlax-ename->vla-object obj)
				       'textposition
			     )
			     _ang
			     (* (getvar 'dimtxt) 10.)
		      )
	   )				;setq
	   (vlax-put (vlax-ename->vla-object obj) 'textposition p11n)
	 )
	lst_dim
      )
    )					;progn then
    (princ "\nBan da khong chon LINE.")
  )					;if
  (command "_zoom" "P")
  (setvar "DIMJUST" old)
  (setvar "OSMODE" old_osm)
  (princ)
)
(defun txt_angle (ename / blkent entdata _angle)
  (if
    (and
      (= (cdr (assoc 0 (setq entdata (entget ename))))
	 "DIMENSION"
      )
      (setq blkent (tblobjname "block" (cdr (assoc 2 entdata))))
    )
     (while (setq blkent (entnext blkent))
       (if (= (cdr (assoc 0 (setq entdata (entget blkent)))) "MTEXT")
	 (setq _angle (cdr (assoc 50 (entget blkent))))
       )
     )
  )
  _angle
)
(defun lm:clockwise-p (p1 p2 p3)
  ((lambda (n) (< (car (trans p2 0 n)) (car (trans p1 0 n))))
    (mapcar '- p1 p3)
  )
)
(princ)

Cơ bản nè Bee :bz  :

(command "DIMALIGNED"
     pt
     "_per"
     (cdr (assoc 11 (entget (cadr lst))))
     "_none"
     pt
)

  1/ Thiếu 1   "_none" truoc pt 

2/ Nên trả lại biến hệ thống diimupt

3/ Nên thêm (setq old_dli (getvar 'dimdli)) ...... (setvar 'dimdli giatri) ...... (setvar "DIMDLI" old_dli) bởi vì nếu dímtyle đã set Dimdli là rất nhỏ (0.75 chẳng hạn)

lúc đó chạy lisp nhìn thử :) 

Vài góp ý nhỏ . Nói chung bạn tuổi trẻ tài cao :)


  • 1

#9 Bee

Bee

    biết lệnh array

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

Đã gửi 29 November 2016 - 07:37 PM

 

 

Xem cái này sắp xếp thế nào nhé. ^_^

(defun c:test (/ lst old old_osm ss pt lst_dim n p11n)
  (setq lst nil _ang nil)
  (setq old (getvar "DIMJUST"))
  (setq old_osm (getvar 'osmode))
  (if (setq ss (ssget '((0 . "LINE"))))
    (progn
      (command "_zoom" "obj" ss "")
      (setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
      (setq
	lst (vl-sort lst
		     '(lambda (e1 e2)
			(> (if (< (cadr (cdr (assoc 10 (entget e1))))
				  (cadr (cdr (assoc 11 (entget e1))))
			       )
			     (cadr (cdr (assoc 10 (entget e1))))
			     (cadr (cdr (assoc 11 (entget e1))))
			   )		;if e1
			   (if (< (cadr (cdr (assoc 10 (entget e2))))
				  (cadr (cdr (assoc 11 (entget e2))))
			       )
			     (cadr (cdr (assoc 10 (entget e2))))
			     (cadr (cdr (assoc 11 (entget e2))))
			   )		;if e2
			)
		      )
	    )
      )					;setq

      (setq pt (polar (cdr (assoc 10 (entget (car lst))))
		      (angle (cdr (assoc 10 (entget (car lst))))
			     (cdr (assoc 11 (entget (car lst))))
		      )
		      (/ (distance (cdr (assoc 10 (entget (car lst))))
				   (cdr (assoc 11 (entget (car lst))))
			 )
			 2
		      )
	       )
      )
      (setvar "DIMJUST" 1)
      (command "DIMUPT" "OFF")
      (command "DIMALIGNED"
	       pt
	       "_per"
	       (cdr (assoc 11 (entget (cadr lst))))
	       "_none"
	       pt
      )
      (setq lst_dim nil)
      (setq lst_dim (cons (entlast) lst_dim))
      (setq n 2)
      (command "DIMBASELINE")
      (repeat (- (length lst) 2)
	(command "_per" (cdr (assoc 11 (entget (nth n lst)))))
	(setq lst_dim (cons (entlast) lst_dim))
	(setq n (1+ n))
      )
      (command "" "")
      (setvar 'osmode 0)      
      (if (lm:clockwise-p
	    (vlax-get (vlax-ename->vla-object (car lst_dim))
		      'textposition
	    )
	    (vlax-get (vlax-ename->vla-object (car lst))
		      'startpoint
	    )
	    (vlax-get (vlax-ename->vla-object (car lst))
		      'endpoint
	    )
	  )
	(setq _ang (+ pi (txt_angle (car lst_dim))))
	(setq _ang (- pi (txt_angle (car lst_dim))))
      )					;if
      (mapcar
	'(lambda (obj)

	   (setq p11n (polar (vlax-get (vlax-ename->vla-object obj)
				       'textposition
			     )
			     _ang
			     (* (getvar 'dimtxt) 10.)
		      )
	   )				;setq
	   (vlax-put (vlax-ename->vla-object obj) 'textposition p11n)
	 )
	lst_dim
      )
    )					;progn then
    (princ "\nBan da khong chon LINE.")
  )					;if
  (command "_zoom" "P")
  (setvar "DIMJUST" old)
  (setvar "OSMODE" old_osm)
  (princ)
)
(defun txt_angle (ename / blkent entdata _angle)
  (if
    (and
      (= (cdr (assoc 0 (setq entdata (entget ename))))
	 "DIMENSION"
      )
      (setq blkent (tblobjname "block" (cdr (assoc 2 entdata))))
    )
     (while (setq blkent (entnext blkent))
       (if (= (cdr (assoc 0 (setq entdata (entget blkent)))) "MTEXT")
	 (setq _angle (cdr (assoc 50 (entget blkent))))
       )
     )
  )
  _angle
)
(defun lm:clockwise-p (p1 p2 p3)
  ((lambda (n) (< (car (trans p2 0 n)) (car (trans p1 0 n))))
    (mapcar '- p1 p3)
  )
)
(princ)

Cơ bản nè Bee :bz  :

(command "DIMALIGNED"
     pt
     "_per"
     (cdr (assoc 11 (entget (cadr lst))))
     "_none"
     pt
)

  1/ Thiếu 1   "_none" truoc pt 

2/ Nên trả lại biến hệ thống diimupt

3/ Nên thêm (setq old_dli (getvar 'dimdli)) ...... (setvar 'dimdli giatri) ...... (setvar "DIMDLI" old_dli) bởi vì nếu dímtyle đã set Dimdli là rất nhỏ (0.75 chẳng hạn)

lúc đó chạy lisp nhìn thử :) 

Vài góp ý nhỏ . Nói chung bạn tuổi trẻ tài cao :)

Hì,

ok mình sẽ rút knghiem. Mình quick code thì chủ yếu xem chạy đc chưa. Nếu ngon lành cần hoàn thiện thì mới thêm các phần khác vào thôi mà. Chủ thớt ko thấy ý kiến nên cứ để vậy thôi.

 

Thanks.


  • 1

#10 khanh phong

khanh phong

    biết pan

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

Đã gửi 30 November 2016 - 02:56 PM

không phải em không ý kiến, mà là em mới tập tành học về lisp nên không biết gì để comments. Dù sao cũng cám ơn 2 anh đã giúp em, anh có thể chỉnh sửa lại lisp theo góp ý của "pphung 183" không ? vì em không biết cách điều chỉnh


  • 0