Find coordinates for specific polyline vertices

Find coordinates for specific polyline vertices

bigcarl5000kg
Advisor Advisor
3,030 Views
17 Replies
Message 1 of 18

Find coordinates for specific polyline vertices

bigcarl5000kg
Advisor
Advisor

Dear community,

 

I use a LISP to get the coordinates of the polyline vertices, for further use in one command macro with DIESEL expression, for automating the entry of values for a special tool in AutoCAD Mechanical (AMAUTODIM). This tool will (almost) automatically create coordinate dimensions (Mechanical) on the four sides of the polyline, with a pre-set vertical and horizontal distance between the dimensions and the object.

 

Here the LISP:

(defun c:DimAutoOrdinateMECH ( / aadPPL)
  (and
    ; polyline selection without object type test
    (setq aadObj1 (car(entsel)))
    
     ; all vertices of the polyline
    (setq aadPPL (mapcar 'cdr (vl-remove-if-not '(lambda(dp)(= (car dp) 10))(entget aadObj1))))
    
     ; vertices min. Y coordinate
    (setq aad0V (car(vl-sort aadPPL (function (lambda(e1 e2)(<(cadr e1)(cadr e2)))))))

     ; vertices max. Y coordinate
    (setq aadMV (car(vl-sort aadPPL (function (lambda(e1 e2)(>(cadr e1)(cadr e2)))))))
    
     ; vertices min. X coordinate
    (setq aad0H (car(vl-sort aadPPL (function (lambda(e1 e2)(<(car e1)(car e2)))))))

     ; vertices max. X coordinate
    (setq aadMH (car(vl-sort aadPPL (function (lambda(e1 e2)(>(car e1)(car e2)))))))

     ; insertion point vertically left
    (setq aadPVL (mapcar '+ (car(vl-sort aadPPL (function (lambda(e1 e2)(<(car e1)(car e2)))))) '(-60 0 0)))
    
     ; insertion point horizontally top
    (setq aadPHO (mapcar '+ (car(vl-sort aadPPL (function (lambda(e1 e2)(>(cadr e1)(cadr e2)))))) '(0 60 0)))

     ; insertion point vertically right
    (setq aadPVR (mapcar '+ (car(vl-sort aadPPL (function (lambda(e1 e2)(>(car e1)(car e2)))))) '(60 0 0)))

     ; insertion point horizontally bottom
    (setq aadPHU (mapcar '+ aad0V '(0 -60 0)))
  )
)
  

 

One of the tasks of LISP is to find the points for the beginning of dimensions (the zero point). However, this LISP is only suitable for the following cases of object rotation (only one zero X- and Y-point):

bigcarl5000kg_0-1681560730165.png

 

In another case where object rotation allows for two zero X- and Y-points, this LISP defines naturally the same zero point for each dimensions:

bigcarl5000kg_1-1681562628527.png

 

 

 

My goal is to use the correct zero points for each side of the inserted coordinate dimension:

bigcarl5000kg_2-1681562806912.png

 

How to change the LISP to get these zero points combination?

 

Sorry for my expressions, I'm not a programmer 😎. Many thanks in advance for your help

 

 

+++ impossible immediately and miracles within 3 days +++
+++ the only constant is the change +++ stay tuned for more +++
+++ since 03/2023 is Advance Steel in maintenance mode, no further development +++
0 Likes
Accepted solutions (1)
3,031 Views
17 Replies
Replies (17)
Message 2 of 18

ВeekeeCZ
Consultant
Consultant

Possibly like this?

 


(defun c:Dimtest( / aadObj1 l lr xmin ymin lrxmin lrymin) (and ; polyline selection without object type test (setq aadObj1 (car (entsel))) ; all vertices of the polyline (setq l (mapcar 'cdr (vl-remove-if-not '(lambda (dp) (= (car dp) 10)) (entget aadObj1 )))) ; x min (setq xmin (apply 'min (mapcar 'car l))) ; y min (setq ymin (apply 'min (mapcar 'cadr l))) ; p min (setq pmin (list xmin ymin)) ; all points with relative coords (setq lr (mapcar '(lambda (p) (mapcar '- p pmin)) l)) ; all points with xr0 (print (setq lrxmin (vl-remove-if-not '(lambda (p) (equal (car p) 0. 1e-6)) lr))) ; all points with yr0 (print (setq lrymin (vl-remove-if-not '(lambda (p) (equal (cadr p) 0. 1e-6)) lr))) (princ)))

 

Edited.

0 Likes
Message 3 of 18

CADaSchtroumpf
Advisor
Advisor

Or this ?

 

(vl-load-com)
(defun c:DimAutoOrdinateMECH ( / ss ent dxf_entt aadPPL Obj ll ur)
  (princ "\nSelect polyline.")
  (while (null (setq ss (ssget "_+.:E:S" '((0 . "LWPOLYLINE")))))
    (princ "\nSelection is emptie or is not a polyline avaible!")
  )
  (setq
    ent (ssname ss 0)
    dxf_ent (entget ent)
    aadPPL (mapcar 'cdr (vl-remove-if-not '(lambda(x) (= (car x) 10)) dxf_ent))
    Obj (vlax-ename->vla-object ent)
  )
  (vla-GetBoundingBox Obj 'll 'ur)
  (setq
    ll (safearray-value ll)
    ur (safearray-value ur)
    aadPPL (mapcar '(lambda (x) (list (- (car x) (car ll)) (- (cadr x) (cadr ll)))) aadPPL)
  )
)

 

0 Likes
Message 4 of 18

bigcarl5000kg
Advisor
Advisor

@ВeekeeCZ wrote:

Possibly like this?

 


(defun c:Dimtest( / aadObj1 l lr xmin ymin lrxmin lrymin) (and ; polyline selection without object type test (setq aadObj1 (car (entsel))) ; all vertices of the polyline (setq l (mapcar 'cdr (vl-remove-if-not '(lambda (dp) (= (car dp) 10)) (entget aadObj1 )))) ; x min (setq xmin (apply 'min (mapcar 'car l))) ; y min (setq ymin (apply 'min (mapcar 'cadr l))) ; p min (setq pmin (list xmin ymin)) ; all points with relative coords (setq lr (mapcar '(lambda (p) (mapcar '- p pmin)) l)) ; all points with xr0 (print (setq lrxmin (vl-remove-if-not '(lambda (p) (equal (car p) 0. 1e-6)) lr))) ; all points with yr0 (print (setq lrymin (vl-remove-if-not '(lambda (p) (equal (cadr p) 0. 1e-6)) lr))) (princ)))

 

Edited.


 

Hi @ВeekeeCZ,

 

thanks you, I'm trying to understand your LISP - heavy fighting for an amateur 😉. I thought a little about the possibilities that can arise and which / how many zero points for dimensions will be needed. The polyline will be always aligned with one bottom side to the X- (and) or one left side to Y-axis, to get simple dimensioning (no pointless rotation). Mirrored situations will not be used for this aligned.

 

I use a triangle as the smallest possible polyline -> 2 to 3 zero points for the dimensions needed. 

zero point for 1. dimension = point with smallest X of (Xmin;Ymin or Xvar;Ymin or Xmax;Ymin)

zero point for 2. dimension = point with biggest Y of (Xmin;Ymin or Xmin;Yvar or Xmin;Ymax)

zero point for 3. dimension = point with biggest X of (Xmin;Ymin or Xvar;Ymin or Xmax;Ymin)

zero point for 4. dimension = point with smallest Y of (Xmin;Ymin or Xmin;Yvar or Xmin;Ymax)

bigcarl5000kg_0-1681597815120.png

 

The zero points calculation can also be applied to the followed (most complex) case with multiple variable points:

bigcarl5000kg_1-1681597846914.png

 

I need always to get the separate coordinates of initial point (zero point - calculation see above) for each of these 4 dimensions in that order (1. - 4. dimension), to put these variable names (eg. ZeroDim1, ZeroDim2, ZeroDim3, ZeroDim4) in my command macro with DIESEL expression (it is needed for use in the special dimensioning tool in AutoCAD Mechanical).

Can you please explain me the next steps? Or does your LISP have to be modified somehow?

Many thanks in advance

 

+++ impossible immediately and miracles within 3 days +++
+++ the only constant is the change +++ stay tuned for more +++
+++ since 03/2023 is Advance Steel in maintenance mode, no further development +++
0 Likes
Message 5 of 18

ВeekeeCZ
Consultant
Consultant

Sorry, not following.

Post a clear example of values (in the format you need) to set to which variables that you need for your macro.

Remember - I don't have Mechanical, I have no idea how this feature works and what input it requires.

Message 6 of 18

Kent1Cooper
Consultant
Consultant

I wonder whether you could make ORDINATE Dimensions work for you.  You would need to determine the lower left corner of the bounding box, and use its coordinates in XDATUM or YDATUM options for the Dimensions.  I think the arrowheads in your images are not a possibility, but maybe a configuration can be found that will "tell the story" sufficiently.

Kent Cooper, AIA
Message 7 of 18

bigcarl5000kg
Advisor
Advisor

@Kent1Cooper,

@ВeekeeCZ,

 

in AutoCAD Mechanical (really great AutoCAD vertical product with many amazing tools), I can use a special tool - AMAUTODIM (Multiple Dimensioning) for coordinate dimensioning. 

 

bigcarl5000kg_0-1681647133678.png

 

bigcarl5000kg_1-1681647133688.png

 

In my German language version it looks like this:

bigcarl5000kg_2-1681647133692.png

 

 I use one command macro to load the vertices of the polyline / determine the max and min coordinates via LISP, run AMAUTODIM and then use the appropriate vertices for the zero points of the four dimensions (2x both axes preset), then to set the distance of the dimensions from the object. 

 

My old macro:

^C^CDimAutoOrdinateMECH;\AMAUTODIM;!aadObj1;;!aad0V;!aad0H;_v;!aadPVL;;_h;!aadPHO;;DimAutoOrdinateMECH;\AMAUTODIM;_p;;!aad0V;!aad0H;_v;!aadPVR;;_h;!aadPHU;;

 

Therefor I need to find these 4 zero points and use as input in the command macro. Entry of the zero point and distance from the object for this tool takes place via the command line and can be implemented in a macro.

 

First two dimensions:

bigcarl5000kg_3-1681647133695.png

 

 

Second two dimensions (complete):

bigcarl5000kg_4-1681647133722.png

 

+++ impossible immediately and miracles within 3 days +++
+++ the only constant is the change +++ stay tuned for more +++
+++ since 03/2023 is Advance Steel in maintenance mode, no further development +++
0 Likes
Message 8 of 18

komondormrex
Mentor
Mentor

@bigcarl5000kg what is it for and why wouldn't you do it directly without interim calculations? 

0 Likes
Message 9 of 18

bigcarl5000kg
Advisor
Advisor

@komondormrex,

 

it's a special dimensioning tool in Autocad Mechanical, which I have been using for a long time. It is not possible to control with LISP completely, only entering the insertion points (zero point) of each coordinate dimension and their distance to polyline. I am trying to replace the manual entry of the 4 necessary zero points with automatic detection. Nothing more. I'm only concerned with finding their coordinates using LISP. This Mechanical tool has many advantages over standard AutoCAD coordinate dimensioning. It works somehow in its current form, but it can't partly find the right points on the polyline. And that's my goal.

+++ impossible immediately and miracles within 3 days +++
+++ the only constant is the change +++ stay tuned for more +++
+++ since 03/2023 is Advance Steel in maintenance mode, no further development +++
0 Likes
Message 10 of 18

bigcarl5000kg
Advisor
Advisor

Small animation to AMAUTODIM command from AutoCAD Mechanical (see attachment) - manual entry of zero points for coordinate dimensions and then distance from the object.

 

Second animation - command macro application including current LISP

 

 

+++ impossible immediately and miracles within 3 days +++
+++ the only constant is the change +++ stay tuned for more +++
+++ since 03/2023 is Advance Steel in maintenance mode, no further development +++
0 Likes
Message 11 of 18

bigcarl5000kg
Advisor
Advisor

I need only get these point as variables:

zero point for 1. dimension = point with smallest X-value of (Xmin;Ymin or Xvar;Ymin or Xmax;Ymin)

zero point for 2. dimension = point with biggest Y-value of (Xmin;Ymin or Xmin;Yvar or Xmin;Ymax)

zero point for 3. dimension = point with biggest X-value of (Xmin;Ymin or Xvar;Ymin or Xmax;Ymin)

zero point for 4. dimension = point with smallest Y-value of (Xmin;Ymin or Xmin;Yvar or Xmin;Ymax)

 

bigcarl5000kg_0-1681663133539.png

 

+++ impossible immediately and miracles within 3 days +++
+++ the only constant is the change +++ stay tuned for more +++
+++ since 03/2023 is Advance Steel in maintenance mode, no further development +++
0 Likes
Message 12 of 18

komondormrex
Mentor
Mentor

regarding 1st animation. why don't you using pt1 and pt4 for all 4 dimension groups? 

0 Likes
Message 13 of 18

bigcarl5000kg
Advisor
Advisor

that's what I currently have and it doesn't meet the required standard. However, this may occur in certain situations (shared zero points)

+++ impossible immediately and miracles within 3 days +++
+++ the only constant is the change +++ stay tuned for more +++
+++ since 03/2023 is Advance Steel in maintenance mode, no further development +++
0 Likes
Message 14 of 18

komondormrex
Mentor
Mentor
Accepted solution

well, check this. outputs list (zero_point_1 zero_point_2 zero_point_3 zero_point_4)

 

(defun c:get_zero_points (/ pline_ename all_pline_vertices min_x max_x min_y max_y min_x_list min_y_list)
  	(setq pline_ename (car (entsel "\nPick target pline:"))
	      all_pline_vertices (mapcar 'cdr (vl-remove-if-not '(lambda (dxf_group) (= 10 (car dxf_group))) (entget pline_ename)))
	      min_x (apply 'min (mapcar 'car all_pline_vertices))
	      max_x (apply 'max (mapcar 'car all_pline_vertices))
	      min_y (apply 'min (mapcar 'cadr all_pline_vertices))
	      max_y (apply 'max (mapcar 'cadr all_pline_vertices))
	      min_x_list (vl-remove-if-not '(lambda (vertex) (= min_x (car vertex))) all_pline_vertices)
	      min_y_list (vl-remove-if-not '(lambda (vertex) (= min_y (cadr vertex))) all_pline_vertices)
	)
	(if (= 1 (length min_y_list))
		(setq zero_point_1 (car min_y_list)
		      zero_point_3 zero_point_1
		)
	  	(setq zero_point_1 (car (vl-sort min_y_list '(lambda (vertex_1 vertex_2) (< (car vertex_1) (car vertex_2)))))
		      zero_point_3 (car (vl-sort min_y_list '(lambda (vertex_1 vertex_2) (> (car vertex_1) (car vertex_2)))))
		)
  	)
	(if (= 1 (length min_x_list))
		(setq zero_point_2 (car min_x_list)
		      zero_point_4 zero_point_2
		)
	  	(setq zero_point_2 (car (vl-sort min_x_list '(lambda (vertex_1 vertex_2) (> (cadr vertex_1) (cadr vertex_2)))))
		      zero_point_4 (car (vl-sort min_x_list '(lambda (vertex_1 vertex_2) (< (cadr vertex_1) (cadr vertex_2)))))
		)
	)
  	(list zero_point_1 zero_point_2 zero_point_3 zero_point_4) 
)

 

0 Likes
Message 15 of 18

bigcarl5000kg
Advisor
Advisor

@komondormrex wrote:

well, check this. outputs list (zero_point_1 zero_point_2 zero_point_3 zero_point_4)

 

 

(defun c:get_zero_points (/ pline_ename all_pline_vertices min_x max_x min_y max_y min_x_list min_y_list)
  	(setq pline_ename (car (entsel "\nPick target pline:"))
	      all_pline_vertices (mapcar 'cdr (vl-remove-if-not '(lambda (dxf_group) (= 10 (car dxf_group))) (entget pline_ename)))
	      min_x (apply 'min (mapcar 'car all_pline_vertices))
	      max_x (apply 'max (mapcar 'car all_pline_vertices))
	      min_y (apply 'min (mapcar 'cadr all_pline_vertices))
	      max_y (apply 'max (mapcar 'cadr all_pline_vertices))
	      min_x_list (vl-remove-if-not '(lambda (vertex) (= min_x (car vertex))) all_pline_vertices)
	      min_y_list (vl-remove-if-not '(lambda (vertex) (= min_y (cadr vertex))) all_pline_vertices)
	)
	(if (= 1 (length min_y_list))
		(setq zero_point_1 (car min_y_list)
		      zero_point_3 zero_point_1
		)
	  	(setq zero_point_1 (car (vl-sort min_y_list '(lambda (vertex_1 vertex_2) (< (car vertex_1) (car vertex_2)))))
		      zero_point_3 (car (vl-sort min_y_list '(lambda (vertex_1 vertex_2) (> (car vertex_1) (car vertex_2)))))
		)
  	)
	(if (= 1 (length min_x_list))
		(setq zero_point_2 (car min_x_list)
		      zero_point_4 zero_point_2
		)
	  	(setq zero_point_2 (car (vl-sort min_x_list '(lambda (vertex_1 vertex_2) (> (cadr vertex_1) (cadr vertex_2)))))
		      zero_point_4 (car (vl-sort min_x_list '(lambda (vertex_1 vertex_2) (< (cadr vertex_1) (cadr vertex_2)))))
		)
	)
  	(list zero_point_1 zero_point_2 zero_point_3 zero_point_4) 
)

 

 


Hi @komondormrex,

 

many thanks for your help. I checked it and added there something - see below (distance calculation between object and dimensions for all 4 dimensions). After LISP started once and the pline is selected,  if I check the variables input in AutoCAD manually via command line (!zero_point_1, !zero_point_2, ...; !dim_pos_left, !dim_pos_top, ...), it works perfect and I get the expected values returned. Only the "!plinesel" causing the problem for me (no use in command line or macro possible) and returns nil and error message *invalid selection*. I don't know why.

 

 

(defun c:DimAutoOrdinateMECH (/ plinesel all_pline_vertices min_x max_x min_y max_y min_x_list min_y_list)		
  	(setq plinesel (car (entsel "\nPick target pline:")); Object selection / without object type test
		  ;all_pline_vertices (mapcar 'cdr (vl-remove-if-not '(lambda (dp) (= 10 (car dp))) (entget plinesel))); All vertices of selected pline (old method)
		  all_pline_vertices (mapcar 'cdr (vl-remove-if-not '(lambda (dxf_group) (= 10 (car dxf_group))) (entget plinesel))); All vertices of selected pline
	      min_x (apply 'min (mapcar 'car all_pline_vertices)); Min X-coordinate of all vertices
	      max_x (apply 'max (mapcar 'car all_pline_vertices)); Max X-coordinate of all vertices
	      min_y (apply 'min (mapcar 'cadr all_pline_vertices)); Min Y-coordinate of all vertices
	      max_y (apply 'max (mapcar 'cadr all_pline_vertices)); Max Y-coordinate of all vertices
	      min_x_list (vl-remove-if-not '(lambda (vertex) (= min_x (car vertex))) all_pline_vertices); List for min X-coordinates of all vertices (multiple possible)
	      min_y_list (vl-remove-if-not '(lambda (vertex) (= min_y (cadr vertex))) all_pline_vertices); List for min Y-coordinates of all vertices (multiple possible)
	)
	
	; Basic points of the dimensions = zero points
	(if (= 1 (length min_y_list)) 
		(setq zero_point_1 (car min_y_list)
		      zero_point_3 zero_point_1
		)
	  	(setq zero_point_1 (car (vl-sort min_y_list '(lambda (vertex_1 vertex_2) (< (car vertex_1) (car vertex_2))))); for dimension 1 
		      zero_point_3 (car (vl-sort min_y_list '(lambda (vertex_1 vertex_2) (> (car vertex_1) (car vertex_2))))); for dimension 3		
		)
	)
		(if (= 1 (length min_x_list)); 
		(setq zero_point_2 (car min_x_list)
		      zero_point_4 zero_point_2
		)
	  	(setq zero_point_2 (car (vl-sort min_x_list '(lambda (vertex_1 vertex_2) (> (cadr vertex_1) (cadr vertex_2))))); for dimension 2
		      zero_point_4 (car (vl-sort min_x_list '(lambda (vertex_1 vertex_2) (< (cadr vertex_1) (cadr vertex_2))))); for dimension 4
		)
	)
  	(list zero_point_1 zero_point_2 zero_point_3 zero_point_4)
	(setq 
		  dim_pos_left (mapcar '+ (car(vl-sort all_pline_vertices (function (lambda(vertex1 vertex2)(<(car vertex1)(car vertex2)))))) '(-60 0 0)); Distance for 1. dimension with position left (M1:5)
		  dim_pos_top (mapcar '+ (car(vl-sort all_pline_vertices (function (lambda(vertex1 vertex2)(>(cadr vertex1)(cadr vertex2)))))) '(0 60 0)); Distance for 2. dimension with position top (M1:5)
		  dim_pos_right (mapcar '+ (car(vl-sort all_pline_vertices (function (lambda(vertex1 vertex2)(>(car vertex1)(car vertex2)))))) '(60 0 0)); Distance for 3. dimension with position right (M1:5)
		  dim_pos_bottom (mapcar '+ (car(vl-sort all_pline_vertices (function (lambda(vertex1 vertex2)(<(cadr vertex1)(cadr vertex2)))))) '(0 -60 0)); Distance for 4. dimension with position bottom (M1:5)
	)
)

 

 

 

+++ impossible immediately and miracles within 3 days +++
+++ the only constant is the change +++ stay tuned for more +++
+++ since 03/2023 is Advance Steel in maintenance mode, no further development +++
0 Likes
Message 16 of 18

komondormrex
Mentor
Mentor

does plinesel cause problem in autocad mechanical? will it get ename variable in other cases? how did you pass it earlier?

 

wouldn't it be easier to set dimension positions like that?

(setq dim_pos_left (list (+ -60 min_x) min_y)

          dim_pos_top (list min_x (+ 60 max_y ))

          dim_pos_right (list (+ 60 max_x) min_y )

          dim_pos_bottom (list min_x (+ -60 min_y ))

)

 

Message 17 of 18

CADaSchtroumpf
Advisor
Advisor

I see my first answer wasn't understood, so I'm adding to it a bit to show what can be done with it.

 

(vl-load-com)
(defun c:DimAutoOrdinateMECH ( / ss ent dxf_entt aadPPL Obj ll ur dim)
  (princ "\nSelect polyline.")
  (while (null (setq ss (ssget "_+.:E:S" '((0 . "LWPOLYLINE")))))
    (princ "\nSelection is emptie or is not a polyline avaible!")
  )
  (setq
    ent (ssname ss 0)
    dxf_ent (entget ent)
    aadPPL (mapcar 'cdr (vl-remove-if-not '(lambda(x) (= (car x) 10)) dxf_ent))
    Obj (vlax-ename->vla-object ent)
  )
  (vla-GetBoundingBox Obj 'll 'ur)
  (setq
    ll (safearray-value ll)
    ur (safearray-value ur)
    dim (mapcar '(lambda (x) (list (- (car x) (car ll)) (- (cadr x) (cadr ll)))) aadPPL)
  )
  (mapcar
    '(lambda (p d)
      (entmake
        (list
          (cons 0 "TEXT")
          (cons 8 (getvar "CLAYER"))
          (cons 10 p)
          (cons 40 (getvar "TEXTSIZE"))
          (cons 1 (rtos (car d) 2 2))
          (cons 50 (* 0.5 pi))
          (cons 7 (getvar "TEXTSTYLE"))
        )
      )
      (entmake
        (list
          (cons 0 "TEXT")
          (cons 8 (getvar "CLAYER"))
          (cons 10 p)
          (cons 40 (getvar "TEXTSIZE"))
          (cons 1 (rtos (cadr d) 2 2))
          (cons 50 0.0)
          (cons 7 (getvar "TEXTSTYLE"))
        )
      )
    )
    (cons ll aadPPL)
    (cons (list 0.0 0.0) dim)
  )
  (prin1)
)

 

0 Likes
Message 18 of 18

bigcarl5000kg
Advisor
Advisor

Hi @komondormrex,

 

thank you for the editing the code for dimension positions. 

 

After LISP started, all variables return some values, which can be triggered via command line - works fine.

bigcarl5000kg_0-1681731702982.png

 

bigcarl5000kg_1-1681731730524.png

 

Does "plinesel" return some value or selection set? I used basically the same thing earlier and it didn't work right for me either 😊

bigcarl5000kg_2-1681731783406.png

 

PS:

What Im trying to achieve / what I'm searching for is repeatedly using the once via LISP selected polyline as a next input for object selection via command line for another ACAD command (similar to "_p" as previous) until another polyline selected, without having to manually select the polyline again and again.

 

 

+++ impossible immediately and miracles within 3 days +++
+++ the only constant is the change +++ stay tuned for more +++
+++ since 03/2023 is Advance Steel in maintenance mode, no further development +++
0 Likes