Leaderboard
Popular Content
Showing content with the highest reputation on 09/05/2025 in Posts
-
(defun c:FOO (/ pt1 pt2) (if (and (setq pt1 (getpoint "\nSpecify first point: ")) (setq pt2 (getpoint pt1 "\nSpecify second point: ")) ) (command-s "._trim" "_o" "_s" "" "_f" pt1 pt2 "" "") ) (princ) )1 point
-
It was more of a qualifier... While I'm sure they exist, I've never personally met anyone who used Python and couldn't compile .NET Haha1 point
-
This thread was mentioned in a similar discussion, so sharing my reply here in kind. If you can compile .NET, use @Danielm103's code - if you instead use Visual LISP, this may help:1 point
-
This supports both: (defun c:FOO (/ *error* _move _set elev acDoc ss objName pt i) (defun *error* (msg) (if ss (vla-delete ss)) (if acDoc (vla-endundomark acDoc)) (cond ((not msg)) ; Normal exit ((member msg '("Function cancelled" "quit / exit abort"))) ; <esc> or (quit) ((princ (strcat "\n** Error: " msg " ** "))) ; Fatal error, display it ) (princ) ) (defun _move (prop /) (vla-move x (vlax-3d-point '(0 0 0)) (vlax-3d-point (mapcar '- (list (car (setq pt (vlax-get x prop))) (cadr pt) elev) pt ) ) ) ) (defun _set (prop /) (vlax-put x prop (list (car (setq pt (vlax-get x prop))) (cadr pt) elev ) ) ) (if (and (ssget "_:L" '( (0 . "ARC,ATTDEF,CIRCLE,DIMENSION,ELLIPSE,HATCH,INSERT,*LEADER,LINE,*POLYLINE,MTEXT,POINT,REGION,SOLID,SPLINE,TEXT" ) ) ) ;; someone asked if they could pick a point: ;;(setq elev (getpoint "\nSpecify point for elevation: ")) ;;(setq elev (last elev)) (setq elev (getreal "\nEnter an elevation: ")) ) (progn (vla-startundomark (setq acDoc (vla-get-activedocument (vlax-get-acad-object))) ) (vlax-for x (setq ss (vla-get-activeselectionset acDoc)) (setq pt nil) (cond ((vl-position (setq objName (vla-get-objectname x)) '("AcDbArc" "AcDbCircle" "AcDbEllipse") ) (_set "center") ) ((vl-position objName '("AcDbAttributeDefinition" "AcDbMText" "AcDbText")) (_set "insertionpoint") ) ((wcmatch objName "AcDb*Dimension") (_move "textposition") ) ((= "AcDbBlockReference" objName) ;; <-- test for and ignore xrefs here, if needed (_set "insertionpoint") ) ((= "AcDbLine" objName) (_set "startpoint") (_set "endpoint") ) ((= "AcDbPoint" objName) (_set "coordinates") ) ((vl-position objName '("AcDbHatch" "AcDbPolyline" "AcDb2dPolyline")) (vla-put-elevation x elev) ) ((vl-position objName '("AcDb3dPolyline" "AcDbLeader" "AcDbSolid")) (setq pt (vlax-get x 'coordinates)) (setq i 0) (setq pt (mapcar (function (lambda (n) (setq i (1+ i)) (if (= 0 (rem i 3)) elev n ) ) ) pt ) ) (vlax-put x 'coordinates pt) ) ((= "AcDbMLeader" objName) (setq pt (vlax-invoke x 'GetLeaderLineVertices 0)) (vla-move x (vlax-3d-point (setq pt (list (car pt) (cadr pt) (caddr pt))) ) (vlax-3d-point (list (car pt) (cadr pt) elev)) ) ) ((= "AcDbRegion" objName) (setq pt (vlax-get (car (setq i (vlax-invoke x 'explode))) 'startpoint ) ) (vla-move x (vlax-3d-point (setq pt (list (car pt) (cadr pt) (nth 2 pt))) ) (vlax-3d-point (list (car pt) (cadr pt) elev)) ) (foreach line i (vla-delete line)) ) ((= "AcDbSpline" objName) (if (= :vlax-true (vla-get-isplanar x)) (progn (setq pt (vlax-get x 'controlpoints)) (vla-move x (vlax-3d-point (setq pt (list (car pt) (cadr pt) (nth 2 pt))) ) (vlax-3d-point (list (car pt) (cadr pt) elev)) ) ) (progn (setq x (entget (vlax-vla-object->ename x))) (setq x (mapcar (function (lambda (p) (cond ((and (member (car p) '(10 11 12 13)) (listp (cdr p)) (= 3 (length (cdr p))) ) (list (car p) (cadr p) (caddr p) elev ) ) (t p) ) ) ) x ) ) (entmod x) ) ) ) (T nil) ) ) ) ) (*error* nil) )1 point
-
P.S.: The interface is available in both Spanish and English. If your operating system language is different, the voice messages will be read in English, but with the pronunciation of your language. If this is your situation and it bothers you, you should search the code for all the English phrases and translate them into your language. It shouldn't take you more than half an hour. You can also mute the speakers . Everyone can do what they think is best.1 point
-
you're welcome. The 'secret' when going MDI is using vla commands only.1 point
-
Hola de nuevo, Offsetea.mp4 Dejé una tarea pendiente en este hilo que intentaré cerrar. Adjunto una nueva versión de Offsetea . A continuación, explico el comportamiento y las opciones del comando. Partimos de una lógica de trabajo basada en el enfoque del código de Evgeny Elpanov. De hecho, esta lógica es más fácil de explicar en código que con palabras: proyectar un segmento entre dos vectores guía (definidos por los extremos del segmento y el punto que precede a cada uno de ellos) que se intersecan en un punto, que se convierte en el foco de la proyección. Al proyectar segmentos rectos, el resultado solo puede ser uno. Sin embargo, en el caso de segmentos de arco, ¿qué ocurre si reemplazamos el foco de proyección? En base a esto, se me ocurrieron dos opciones adicionales: el centro y el polo del arco. También consideré la posibilidad de añadir una tercera opción que permitiera al usuario especificar la ubicación del foco en pantalla. Sinceramente, no creo que esto sea útil (espero que al menos una de las otras dos lo sea ). Así, la funcionalidad del comando es la siguiente: - Selección del segmento de polilínea a proyectar: el comando solo funcionará si la polilínea está compuesta por 2 o más segmentos. Si el segmento seleccionado es recto , los vectores guía se definirán por sus extremos y el punto anterior de cada uno (es decir, los segmentos adyacentes). Si uno de los extremos del segmento es también un extremo de la polilínea, el vector guía para ese extremo será la normal a él. Si el segmento es un arco , los vectores guía predeterminados serán los mismos que para los segmentos rectos (propuesta de Evgeny). Sin embargo, aquí es posible cambiar el enfoque del enfoque secante de Evgeny (tecla '2') al enfoque radial (tecla '1') o al enfoque tangente (tecla '3'). En cuanto a las herramientas de control del segmento a proyectar, he implementado un ajuste al estilo GLAVCVS , limitado a los casos posibles para este comando: _end, _mid, _int, _cen, _nod, _ins, _nea. Este ajuste se puede activar o desactivar con F3. La relación entre la posición del cursor y el segmento a proyectar siempre será de seguimiento de segmento en los segmentos rectos. Sin embargo, en los segmentos de arco, puede ser de seguimiento de arco o de cuerda. Para alternar entre ambos, simplemente pulse TAB. El seguimiento de arco está activo mientras el cursor permanece entre los dos vectores de proyección. De lo contrario, cambia automáticamente al seguimiento de cuerda. La diferencia entre ambos radica, por lo tanto, en el comportamiento cuando el cursor se encuentra entre los vectores guía. Estos vectores guía se muestran en pantalla como dos líneas discontinuas rojas. Junto al cursor se muestra texto informativo en tiempo real: Para segmentos rectos (de arriba a abajo): la distancia de desplazamiento desde la ubicación inicial y la longitud del segmento. Para segmentos de arco: distancia de desplazamiento desde la ubicación inicial, radio del arco, longitud del arco y longitud de la cuerda. La visibilidad de esta información se puede activar o desactivar con la tecla "i" . Por último, puedes aumentar o disminuir el tamaño de los indicadores junto al cursor presionando las teclas '+' o '-'. En cuanto al rendimiento del comando, mientras escribía el código, descubrí una mayor variedad de casos de los que inicialmente había pensado. Si el objetivo principal era lograr el seguimiento del segmento de arco según la posición del cursor, creo que este código cubrirá aproximadamente el 90 % de los casos posibles. En los casos donde no sea posible el seguimiento del arco, se realizará a nivel de la cuerda. Espero que a alguien le resulte útil. Offsetea_v2.lsp1 point