Recommended Posts

Potrzebowałbym taką funkcję do kopiowania (a może już jest?):

  1. wybieram funkcje i zaznaczam element
  2. teraz mogę wpisać odległość albo zmierzyć myszą
  3. dopiero teraz wskazuję punkt bazowy i kierunek
  4. po naciśnięciu enter program wykonuje kopię w wybranym kierunku
  5. po kolejnych naciśnięciach entera tworzone są kolejne kopie w takiej samej odległości od ostatniej kopi jak odległość w punkcie 2 i w tym samym kierunku - czyli jak w punkcie 2 wpisze odległość 60, to kopie będą w 60, 120, 180, 240, 300 itp.

 

Share this post


Link to post
Share on other sites

Dzięki za zainteresowanie.

Nie znałem tego sposobu. Ale nie do końca mi pasuje bo muszę znać liczbę powtórzeń na początku. Dodatkowo chciałbym ustawić odległość powtórzeń, a dopiero potem kierunek

Share this post


Link to post
Share on other sites

Chciałbym np. zrobić szyk na tej górnej lini w takiej samej odległości jak pomiędzy okręgami na dolnej.

Mogę sobie skopiować okręgi, potem obrócić ustawić odniesienie a potem kopiować ręcznie brakujące. Albo mierzyć, pamiętać, wpisywać.

A tak: wybieram element,dwa kliki mam odległość wskazuję kierunek a każdy enter to kolejne powtórzenie.

1689797664_2020-10-2918_49_10-Window.thumb.png.5a0e0ebe07df3823d228ed1d4a16b93a.png

Share this post


Link to post
Share on other sites

Taki skrypt mógłby wyglądać np tak:

(defun C:SzykManualny (  / element odleglosc bazowy kierunek 
							Koniec licznik
							kopiuj
	*error* )	(defun *error* ( msg / ) 
		(if (not (null msg ) )	(progn (princ "\nC:SzykManualny:*error*: " ) (princ msg ) (princ "\n")	) )
	)
	(setq Koniec ""
			licznik 1 )
	
	(defun kopiuj (  / v1
		*error* )	(defun *error* ( msg / ) 
			(if (not (null msg ) )	(progn (princ "\nkopiuj:*error*: " ) (princ msg ) (princ "\n")	) )
		)
		( setq v1 ( Vector:Normalize ( Vector: kierunek bazowy  ) ) ) 
		( setq v  ( Vector:XScalar v1 (* odleglosc licznik ) ) )
		( setq clone (vlax-invoke-method element 'Copy) )
		( setq px (Vector+ bazowy v ))
		(vlax-invoke-method clone 'Move (vlax-3d-point bazowy) (vlax-3d-point px)  )
		(setq licznik (1+ licznik)) 
	)
	
	
	(setq element (SelSet:Entsel "Wskaż element" nil))
		(if (null element) (*error* nil) )
	(setq odleglosc (ZWCAD:GetDist "Podaj odległość" poprzedniaOdleglosc))
		(if (null odleglosc) (*error* nil) )
	(setq bazowy (ZWCAD:Getpoint "Wskaż punkt bazowy" nil nil ) )
		(if (null bazowy) (*error* nil) )
	(setq kierunek (ZWCAD:Getpoint "Wskaż kierunek" bazowy nil ) )
		(if (null kierunek) (*error* nil) )
	(while	(equal Koniec "")
		( kopiuj )
		(setq Koniec ( ZWCAD:GetString "Czy wstawić kolejny" "" ) )
	)
	
	(setq poprzedniaOdleglosc odleglosc)
	(princ)
)

(defun Vector: ( A B /
  *error* ) 	(defun *error* ( msg / ) 
		(if (not (null msg ) )	(progn (princ "\nVector::*error*: " ) (princ msg ) (princ "\n")	) )
	)       
	(list 
		(- (car A) (car B ) )
		(- (cadr A) (cadr B ) )
		(- (caddr A) (caddr B ) )
	)
)

(defun Vector:Length (vec / s 
 *error* ) 	(defun *error* ( msg / ) 
		(if (not (null msg ) )	(progn (princ "\nVector:Length:*error*: " ) (princ msg ) (princ "\n")	) )
	)       
	(setq s (+ (* (car vec) (car vec) ) (* (cadr vec) (cadr vec) ) (* (caddr vec) (caddr vec) )))
	(if (< s 0.0000000000001 ) 0.0 (sqrt s ))
) 
(defun Vector:Normalize (v / len 
	*error* ) 	(defun *error* ( msg / ) 
		(if (not (null msg ) )	(progn (princ "\nVector:Normalize:*error*: " ) (princ msg ) (princ "\n")	) )
	)       
	(setq len (Vector:Length v) )
	(if (< len 0.00000001)	
		(list 0.0 0.0 0.0 )
		(progn
			(list 	(/ (car v ) len)
					(/ (cadr v ) len)
					(/ (caddr v ) len)	
			)
		)
	)
)


(defun Vector:XScalar (v s / 
 *error* ) 	(defun *error* ( msg / ) 
		(if (not (null msg ) )	(progn (princ "\nVector:XScalar :*error*: " ) (princ msg ) (princ "\n")	) )
	)      
	(mapcar '(lambda (x) (* x s) ) v )
)

(defun Vector+ (A B / 
 *error* ) 	(defun *error* ( msg / ) 
		(if (not (null msg ) )	(progn (princ "\n Vector+ : *error*: " ) (princ msg ) (princ "\n")	) )
	)                  
	(if (null A) (setq A (list 0.0 0.0 0.0  ) ))
	(if (null B) (setq B (list 0.0 0.0 0.0  ) ))
	(list 
		(+ (car A ) (car B) )
		(+ (cadr A ) (cadr B) )
		(+ (caddr A ) (caddr B ) )
	)
)

(defun SelSet:Entsel (tresc filter / OldNoMutt MSel OutVal 
 *error* ) 	(defun *error* ( msg / ) 
		(if (not (null msg ) )	(progn (princ "\nSelSet:Entsel:*error*: " ) (princ msg ) (princ "\n")	) )
	)      

	(setq tresc (strcat "\n" tresc ": ") )
	(prompt tresc )
	
	(setq OldNoMutt (getvar 'NOMUTT))	
	(setvar 'NOMUTT 1)	
	(setq MSel
		(if (null filter)
			(vl-catch-all-apply 'ssget (list ":S:E" ))
			(vl-catch-all-apply 'ssget (list ":S:E" filter ))
		)
	)
		
	(setvar 'NOMUTT OldNoMutt )
	(if (vl-catch-all-error-p MSel)
	(progn
		(prompt (vl-catch-all-error-message MSel))
	)
	(progn
	  (if MSel (progn		
		(setq OutVal (vlax-ename->vla-object  (ssname MSel 0)) )			
	  ))
	)
	)
	OutVal
)


(defun ZWCAD:GetDist (tresc domyslny / Wynik trescformat liczba  
	*error* ) 	(defun *error* ( msg / ) 
		(if (not (null msg ) )	(progn (princ "\nZWCAD:GetDist:*error*: " ) (princ msg ) (princ "\n")	) )
	)      	
	(if domyslny (if (numberp domyslny) (setq tresc (strcat tresc "<" (rtos domyslny 2 4) ">") )))
	(setq tresc (strcat "\n" tresc ": "))
	(setq liczba(vl-catch-all-apply 'getdist (list tresc )))
	(if (vl-catch-all-error-p liczba)
	(progn
		(prompt (vl-catch-all-error-message liczba))
		(setq Wynik nil )
	)
	(progn
	  (if (null liczba) 
		(setq Wynik domyslny )
		(setq Wynik liczba)
	  )
	)
  )
  Wynik
)


(defun ZWCAD:Getpoint (tresc P0 domyslny / SelPt Wynik 
 *error* ) 	(defun *error* ( msg / ) 
		(if (not (null msg ) )	(progn (princ "\nZWCAD:Getpoint:*error*: " ) (princ msg ) (princ "\n")	) )
	)      
;(ZWCAD:Getpoint tresc P0 domyslny )
	(setq tresc (strcat "\n" tresc ": "))
	(if (not(null P0))
		(setq SelPt(vl-catch-all-apply 'getpoint (list P0 tresc )))
		(setq SelPt(vl-catch-all-apply 'getpoint (list  tresc )))
	)
	(if (vl-catch-all-error-p SelPt)
	(progn
		(prompt (vl-catch-all-error-message SelPt))
		(setq Wynik nil )
	)
	(progn				
	  (if (null SelPt) 
		(setq Wynik domyslny )
		(setq Wynik SelPt)
	  )
	)
  )
  Wynik
)


(defun ZWCAD:GetString (tresc domyslny / 
	*error* ) 	(defun *error* ( msg / ) 
		(if (not (null msg ) )	(progn (princ "\nZWCAD:GetString:*error*: " ) (princ msg ) (princ "\n")	) )
	)      
	(setq tresc (strcat "\n" tresc ": "))
	(String:Get tresc domyslny)
)

(defun String:Get (komunikat defVal / Wynik tekst 
	*error* ) 	(defun *error* ( msg / ) 
		(if (not (null msg ) )	(progn (princ "\nString:Get:*error*: " ) (princ msg ) (princ "\n")	) )
	)      
	;	(setq komunikat "podaj tekst" )
	;	(setq defVal "SLU" )
	 
	(if defVal (if (not(= defVal "")) (setq komunikat (strcat komunikat "<" defVal ">:" ) )) )
	(setq tekst(vl-catch-all-apply 'getstring (list komunikat )))
	(if (vl-catch-all-error-p tekst)
	(progn
		(prompt (vl-catch-all-error-message tekst))
		(setq Wynik nil )
	)
	(progn
	  (if (null tekst) 
		(setq Wynik defVal )
		(if (= tekst "")
			(setq Wynik defVal )
			(if (= tekst ".")
				(setq Wynik "")
				(setq Wynik tekst)
			)
		)
	  )
	)
  )
  Wynik

)

 

Szyk.lsp

Share this post


Link to post
Share on other sites

Dziękuję. Bardzo mi to ułatwi życie.

Jest nawet lepiej niż myślałem bo można wybrać dowolny punkt bazowy.

Jeden tylko problem mam,że mogę wskazać tylko jeden element do kopiowania a chciałbym móc zaznaczyć więcej obiektów.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...