VetCAD

Дуга, размер дуги на дуге, окружности, дуговом сегменте полилинии.

   1 оценка

размещено: 16 Мая 2024
обновлено: 16 Мая 2024

В продолжении форумной темы об отрисовке размера с/без дуги на дуге, окружности расширенная версия с добавленной возможностью выбора дугового сегмента полилинии и переключение по пробелу привязки размерного текста к курсору или к середине дугового размера.

;************************************************************************************************************************************************************

;	koMon, май 2024

;************************************************************************************************************************************************************

(defun get_center_point (start_point end_point bulge)
	(polar (polar start_point (angle start_point end_point) (* 0.5 (distance start_point end_point)))
		   (- (angle start_point end_point) (* 0.5 pi))
		   (/ (* 0.5 (distance start_point end_point)) (/ (sin (- pi (* 2 (atan bulge)))) (cos (- pi (* 2 (atan bulge))))))
    )
)

;************************************************************************************************************************************************************

(defun c:dim_arc (/ circle arc_bearing_data center bulge start_param is_pline dim_arc_point_1 arc_point_list dim_arc_textposition dim_arc
					arc centered is_pline dim_reset
				 )
	(setq centered t)
	(while (null circle)
		(setq arc_bearing_data (entsel "\nВыберите окружность/дугу/дуговой сегмент полилинии: "))
		(cond
			((null arc_bearing_data) (setq circle nil))
			((member (cdr (assoc 0 (entget (setq circle (car arc_bearing_data))))) '("ARC" "CIRCLE"))
				(setq center (vlax-get (vlax-ename->vla-object circle) 'center))
			)
			((and (= "LWPOLYLINE" (cdr (assoc 0 (entget circle))))
				  (not (zerop (setq bulge (vla-getbulge (vlax-ename->vla-object circle)
				  						  				(setq start_param
																(fix (vlax-curve-getparamatpoint circle
																								(vlax-curve-getclosestpointto
																									circle
																									(trans (cadr arc_bearing_data) 1 0)
																								)
																	 )
																)
														)
										  )
							  )
					   )
				  )
				  (setq is_pline t)
			 )
				(setq center (get_center_point (vlax-curve-getpointatparam circle start_param) (vlax-curve-getpointatparam circle (1+ start_param)) bulge))
			)
			(t (setq circle nil))
		)
	)
	(setq dim_arc_point_1 (trans (vlax-curve-getclosestpointto circle (trans (getpoint "\nУкажите первую точку дугового размера: ") 1 0)) 0 1)
	      dim_arc_point_2 (trans (vlax-curve-getclosestpointto circle (trans (getpoint dim_arc_point_1 "\nУкажите вторую точку дугового размера: ") 1 0)) 0 1)
	)
	(if is_pline
		(progn
			(if (< (vlax-curve-getparamatpoint circle (trans dim_arc_point_1 1 0)) start_param)
					(setq dim_arc_point_1 (trans (vlax-curve-getpointatparam circle start_param) 0 1))
			)
			(if (> (vlax-curve-getparamatpoint circle (trans dim_arc_point_1 1 0)) (1+ start_param))
					(setq dim_arc_point_1 (trans (vlax-curve-getpointatparam circle (1+ start_param)) 0 1))
			)
			(if (< (vlax-curve-getparamatpoint circle (trans dim_arc_point_2 1 0)) start_param)
					(setq dim_arc_point_2 (trans (vlax-curve-getpointatparam circle start_param) 0 1))
			)
			(if (> (vlax-curve-getparamatpoint circle (trans dim_arc_point_2 1 0)) (1+ start_param))
					(setq dim_arc_point_2 (trans (vlax-curve-getpointatparam circle (1+ start_param)) 0 1))
			)
		)
	)
	(setq arc_point_list (list dim_arc_point_1 dim_arc_point_2)
	      dim_arc_textposition dim_arc_point_2
	      dim_arc (vla-adddimarc (vla-get-block (vla-get-activelayout (vla-get-activedocument (vlax-get-acad-object))))
				     (vlax-3d-point center)
				     (vlax-3d-point (trans dim_arc_point_1 1 0))
				     (vlax-3d-point (trans dim_arc_point_2 1 0))
				     (vlax-3d-point dim_arc_textposition)
		      )
	      arc (vla-addarc (vla-get-block (vla-get-activelayout (vla-get-activedocument (vlax-get-acad-object))))
		       	      (vlax-3d-point center)
					  (distance center (trans (car arc_point_list) 1 0))
		       	      (angle center (trans (car arc_point_list) 1 0))
		       	      (angle center (trans (cadr arc_point_list) 1 0))
		  )
	)
  	(vla-put-color arc 230)
  	(vla-put-lineweight arc 50)
  	(princ "\n<ЛКМ> дуга + размер дуги, <ПКМ> дуга")
	(while (and (setq dim_arc_textposition (grread t 5 0)) (not (member (car dim_arc_textposition) '(3 25))))
		(if (= 5 (car dim_arc_textposition))
				(progn
					(if centered
						(if dim_reset
							(progn
								(vla-erase dim_arc)
								(setq dim_arc (vla-adddimarc (vla-get-block (vla-get-activelayout (vla-get-activedocument (vlax-get-acad-object))))
		  										    		 (vlax-3d-point center)
		  										    		 (vlax-3d-point (trans dim_arc_point_1 1 0))
		  										    		 (vlax-3d-point (trans dim_arc_point_2 1 0))
		  										    		 (vlax-3d-point (cadr dim_arc_textposition))
		  									  )
									  dim_reset nil
								)
							)
							(vlax-put dim_arc 'textmovement 0)
						)
						(progn
							(vlax-put dim_arc 'textmovement 0)
							(vlax-put dim_arc 'textposition (cadr dim_arc_textposition))
							(setq dim_reset t)
						)
					)
				  	(vlax-put dim_arc 'arcpoint (trans (cadr dim_arc_textposition) 1 0))
				  	(if (not (equal (vla-get-measurement dim_arc) (vla-get-arclength arc) 1e-6))
						(progn
						  (setq arc_point_list (reverse arc_point_list))
						  (vla-put-startangle arc (angle center (trans (car arc_point_list) 1 0)))
						  (vla-put-endangle arc (angle center (trans (cadr arc_point_list) 1 0)))
						)
				  	)
				)
				(if (equal '(2 32) dim_arc_textposition) (setq centered (not centered)))
		)
	)
	(if (= 25 (car dim_arc_textposition)) (vla-erase dim_arc))
	(princ)
)

;************************************************************************************************************************************************************