# [Gmsh] If () Endif issues

David Colignon David.Colignon at ulg.ac.be
Wed Mar 25 16:32:26 CET 2015

```On 25/03/15 15:19, Danny Holstein wrote:

> Thanks so much, that worked like a charm!
>
> Is there the equivalent of the Point{} function for Line, to get the point indices for a line?

Hi Danny,

https://geuz.org/gmsh/doc/texinfo/gmsh.html#Transformations

Boundary { transform-list }

(Not a transformation per-se.) Returns the boundary of the elementary entities in transform-list.

Regards,

Dave

--
David Colignon, Ph.D.
1er Logisticien de Recherche
Université de Liège
ACE - Applied & Computational Electromagnetics
Sart-Tilman B28
10, Grande Traverse
4000 Liège - BELGIQUE
Tél: +32 (0)4 366 37 32
http://www.ulg.ac.be/nic4

The more scripting I do, the more I like to pass off the work to functions.
>
> BTW:  The following script are my functions to radius corners and to construct a DXF drawing, I hope someone can get use from it:
>
> //
> // Author:	Danny Holstein
> // Started:	2/12/15
> //
> // Function radius_corner(aL, bL, aR, bR, r)
> // 	Where L and R refer to left and right lines, y = ax + b, and r is radius on corners
> // 	rc_arry[] is used to dummy up an argument list, rc_arry[] = {aL, bL, aR, bR,  r}
> // 								  = { 0,  1,  2,  3,  4}
>
>    angleL = Atan2(rc_arry[0], 1.0); // Printf("rc_arry[0]=%f, angleL=%f", rc_arry[0], angleL);
>    angleR = Atan2(rc_arry[2], 1.0);
>    If (angleL == angleR)
>      Error("Two lines may not be parallel for radiusing");
>    EndIf
>    sign = (angleL > angleR ? 1.0 : -1.0);
>    x_center = ((rc_arry[1] - rc_arry[3]) + sign*rc_arry[4]*(1/Cos(angleR) - 1/Cos(angleL)))
> 	      /(rc_arry[2] - rc_arry[0]);
>    y_center = rc_arry[0] * x_center + rc_arry[1] - sign*rc_arry[4]/Cos(angleL);
>    PC = newp;  Point(PC) = {x_center, y_center, 0, mesh_sz};
>
>    PL = newp; Point(PL) = {x_center - sign*rc_arry[4]*Sin(angleL), y_center + sign*rc_arry[4]*Cos(angleL), 0, mesh_sz};
>    PR = newp; Point(PR) = {x_center - sign*rc_arry[4]*Sin(angleR), y_center + sign*rc_arry[4]*Cos(angleR), 0, mesh_sz};
>    x_center = (rc_arry[1] - rc_arry[3])
> 	      /(rc_arry[2] - rc_arry[0]);
>    y_center = rc_arry[0] * x_center + rc_arry[1];
>    PInt = newp; Point(PInt) = {x_center, y_center, 0, mesh_sz};
> Return
>
> // Function radius_int(PIntL, PInt, PIntR, r)
> // 	Where PtL, PtC, PtR, r refer to Points left, center and right, and r is radius
> // 	rint_arry[] is used to dummy up an argument list, rint_arry[] = (PIntL, PInt, PIntR, r)
> // 								      = {    0,    1,     2,  3}
>    PIntL =  rint_arry[0]; PInt =  rint_arry[1]; PIntR =  rint_arry[2];
>    xlf[] = Point{PIntL}; xint[] = Point{PInt}; xrt[] = Point{PIntR};
>
>    If (((xrt[0] - xint[0]) != 0) && ((xint[0] - xlf[0]) != 0))  // check for vertical line
>      If (rint_arry[3] > 0.0)	// radius intersection
>        rc_arry[] = {(xint[1] - xlf[1])/(xint[0] - xlf[0]),
> 		    xint[1] - ((xint[1] - xlf[1])/(xint[0] - xlf[0]))*xint[0],
> 		    (xrt[1] - xint[1])/(xrt[0] - xint[0]),
> 		    xint[1] - ((xrt[1] - xint[1])/(xrt[0] - xint[0]))*xint[0],
> 		    rint_arry[3]};
>      EndIf
>      If (rint_arry[3] == 0.0)	// radius is zero, set all points to PInt so that the lines will intersect
>        PL = PR = PInt
>      EndIf
>    EndIf
>
>    If ((xrt[0] - xint[0]) == 0)  // check for vertical line
>      If (rint_arry[3] > 0.0)	// radius intersection
>        x_center = xrt[0] - rint_arry[3];
>        A  = (xint[1] - xlf[1])/(xint[0] - xlf[0]);
>        B  = xint[1] - A * xint[0] + (rint_arry[3] * Sqrt(A^2 + 1));
>        y_center = A * x_center + B;
>        PC = newp; Point(PC) = {x_center, y_center, 0, mesh_sz};
>        PL = newp; Point(PL) = {x_center + rint_arry[3], y_center, 0, mesh_sz};
>        angleL = Atan(A); PR = newp; Point(PR) = {x_center + rint_arry[3]*Sin(angleL), y_center - rint_arry[3]*Cos(angleL), 0, mesh_sz};
>      EndIf
>      If (rint_arry[3] == 0.0)	// radius is zero, set all points to PInt so that the lines will intersect
>        PL = PR = PInt
>      EndIf
>    EndIf
> Return
>
> // Function pt2line(PL1, PL2, PT), dist
> // 	Where PL1, PL2 refer to line points left, right; PT is the reference point and dist, distance to the right
> // 	pt2line_arry[] is used to dummy up an argument list, pt2line_arry[] = (PL1, PL2, PT), dist
> // 								      = {    0,    1,     2}
> Function pt2line
>    PL1 =  pt2line_arry[0]; PL2 =  pt2line_arry[1]; PT =  pt2line_arry[2];
>    xlf[] = Point{PL1}; xrt[] = Point{PL2}; xint[] = Point{PT};
>    a = (xrt[1] - xlf[1])/(xrt[0] - xlf[0]);
>    angleL = Atan2((xrt[1] - xlf[1]), (xrt[0] - xlf[0]));
>    dist = ((xint[1]  - a*xint[0]) - (xlf[1]  - a*xlf[0])) * Cos(angleL);  Printf("dist=%f", dist);
> Return
>
> // Function dbl_radii(PT1, HT, AngleR, R1, R2)
> // 								      = {    0,    1,     2}
>    Angle2 = AngleR / (R2/R1 + 1.0); Angle1 = AngleR - Angle2;
>    cp[] = Point{PT1};
>    delta_x = - ((R2 - R1) * Sin(Angle2) + R1 * Sin(AngleR));
>    delta_y = R2 - (R2 - R1) * Cos(Angle2) - R1 * Cos(AngleR);
>    B = cp[1] + Tan(AngleR) * cp[0];
>    Y = HT - delta_y; X = (B - Y)/Tan(AngleR); PtR = newp;  Point(newp) = {X, Y, 0, mesh_sz};
>    Y -=  R1 * Cos(AngleR); X -=  R1 * Sin(AngleR); PtC = newp;  Point(newp) = {X, Y, 0, mesh_sz};
>    Y +=  R1 * Cos(Angle2); X +=  R1 * Sin(Angle2); PtL = newp;  Point(newp) = {X, Y, 0, mesh_sz};
>    radii_one = newl; Circle(radii_one) = {PtL, PtC, PtR}; arc_pts[] = {PtR, PtC, PtL}; Call arc_dxf;
>    PtR = PtL;
>    Y -=  R2 * Cos(Angle2); X -=  R2 * Sin(Angle2); PtC = newp;  Point(newp) = {X, Y, 0, mesh_sz};
>    Y  =  HT; PtL = newp;  Point(newp) = {X, Y, 0, mesh_sz};
>    radii_two = newl; Circle(radii_two) = {PtL, PtC, PtR}; arc_pts[] = {PtR, PtC, PtL}; Call arc_dxf;
> Return
>
> // Function dxf_init
> Function dxf_init
>    Printf(Str("0", "SECTION", "2", "ENTITIES")) > dxf_file;
> Return
>
> // Function line_dxf(line_dxf_num)
> Function line_dxf
>    func_pt[] = Point{cL[0]};
>    Printf(Str("  0", "LINE", "  8", "Gun_Geom", "10")) >> dxf_file; // layer "Gun_Geom"
>    Printf("%f", func_pt[0]/m_per_mm) >> dxf_file;  // x0
>    Printf(" 20") >> dxf_file;
>    Printf("%f", func_pt[1]/m_per_mm) >> dxf_file;  // y0
>    Printf(" 11") >> dxf_file;
>    func_pt[] = Point{cL[1]};
>    Printf("%f", func_pt[0]/m_per_mm) >> dxf_file;  // x1
>    Printf(" 21") >> dxf_file;
>    Printf("%f", func_pt[1]/m_per_mm) >> dxf_file;  // y1
> Return
>
> // Function line_dxf(arc_dxf_num);  arc_pts[] = {pt_start, pt_center, pt_stop};
> Function arc_dxf
>    If (arc_pts[0] != arc_pts[2])	//  draw if the points are different, if the same, there is no radius
>      ctr_pt[] = Point{arc_pts[1]};
>      start_pt[] = Point{arc_pts[0]};
>      stop_pt[] = Point{arc_pts[2]};
>      Printf(Str("  0", "ARC", "  8", "Gun_Geom", " 10")) >> dxf_file;
>      Printf("%f", ctr_pt[0]/m_per_mm) >> dxf_file; // xC
>      Printf(" 20") >> dxf_file;
>      Printf("%f", ctr_pt[1]/m_per_mm) >> dxf_file; // yC
>      Printf(" 40") >> dxf_file;
>      Printf("%f", Sqrt((ctr_pt[0]-start_pt[0])^2 + (ctr_pt[1]-start_pt[1])^2)/m_per_mm) >> dxf_file; // radius
>      Printf(" 50") >> dxf_file;
>      Printf("%f", (180/Pi) * Atan2(start_pt[1]-ctr_pt[1], start_pt[0]-ctr_pt[0])) >> dxf_file; // angle_start (degrees)
>      Printf(" 51") >> dxf_file;
>      Printf("%f", (180/Pi) * Atan2(stop_pt[1]-ctr_pt[1], stop_pt[0]-ctr_pt[0])) >> dxf_file; // angle_stop (degrees)
>    EndIf
> Return
>
> // Function dxf_complete
> Function dxf_complete
>    Printf(Str("0", "ENDSEC", "0", "EOF")) >> dxf_file;
> Return
>
>
>
>
> ----- Original Message -----
> From: "Christophe Geuzaine" <cgeuzaine at ulg.ac.be>
> To: "Danny Holstein" <dgholstein at embarqmail.com>
> Cc: gmsh at geuz.org
> Sent: Thursday, March 5, 2015 12:43:25 PM
> Subject: Re: [Gmsh] If () Endif issues
>
>
>> On 24 Feb 2015, at 15:03, Danny Holstein <dgholstein at embarqmail.com> wrote:
>>
>> Thanks so much, that was simple!
>>
>> On a related question (related to my geometry, that is), is there a way to construct a line loop using an array of lines?  When parametrizing, I will not have the same number of line features depending on whether I radius a corner or not (as well as other conditionals).  It would be easy to add line elements to an array and then form the line loop with those, I don't see how to do it otherwise.
>>
>> Are there some GMSH array examples to look at?  Arrays of points, of lines?
>>
>
> Sure, just construct an array with the IDs of the points/lines you want ; see e.g. tutorial/t5.geo where a surface loop is constructed this way.
>
> There are many useful operators on lists, e.g. += to append or -= to remove. The "Boundary" and "CombinedBoundary" operators are also often useful to automate boundary generation.
>
> Christophe
>
>
>> Regards,
>> Dan
>>
>> ----- Original Message -----
>> From: "Christophe Geuzaine" <cgeuzaine at ulg.ac.be>
>> To: "Danny Holstein" <dgholstein at embarqmail.com>
>> Cc: gmsh at geuz.org
>> Sent: Tuesday, February 24, 2015 3:17:42 AM
>> Subject: Re: [Gmsh] If () Endif issues
>>
>>
>>> On 24 Feb 2015, at 04:21, Danny Holstein <dgholstein at embarqmail.com> wrote:
>>>
>>> All,
>>>
>>> The attached crashes GMSH versions 2.8.6 and 2.8.5 on Linux x86_64 when the logical resolves to "false".
>>>
>>> Also, when it resolves to "true", it doesn't read the following script line, so I put in a semicolon, which causes the scripting language to throw an "error".
>>>
>>
>> Hi Danny - Change "Endif" into "EndIf" on line 16 of functions.dat. (We will try to fix the crash, which is due to an unclean file close.)
>>
>>> Any help would be appreciated.
>>>
>>> Regards,
>>> Dan
>>> <functions.dat><keri.dat><keri.geo>_______________________________________________
>>> gmsh mailing list
>>> gmsh at geuz.org
>>> http://www.geuz.org/mailman/listinfo/gmsh
>>
>> --
>> Prof. Christophe Geuzaine
>> University of Liege, Electrical Engineering and Computer Science
>> http://www.montefiore.ulg.ac.be/~geuzaine
>>
>>
>>
>>
>> _______________________________________________
>> gmsh mailing list
>> gmsh at geuz.org
>> http://www.geuz.org/mailman/listinfo/gmsh
>

```