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,

What about Boundary {} ?

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:

//
// radiusing corners
// 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}

Function radius_corner
   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};
   radii_one = newl; Circle(radii_one) = {PL, PC, PR};
   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}
Function radius_int
   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]};
       Call radius_corner;
     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};
       radii_one = newl; Circle(radii_one) = {PL, PC, PR};
     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}
Function dbl_radii
   PT1 =  dbl_radii_arry[0]; HT =  dbl_radii_arry[1]; AngleR =  
dbl_radii_arry[2]; R1 =  dbl_radii_arry[3]; R2 =  dbl_radii_arry[4];
   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" <[email protected]>
To: "Danny Holstein" <[email protected]>
Cc: [email protected]
Sent: Thursday, March 5, 2015 12:43:25 PM
Subject: Re: [Gmsh] If () Endif issues


On 24 Feb 2015, at 15:03, Danny Holstein <[email protected]> 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" <[email protected]>
To: "Danny Holstein" <[email protected]>
Cc: [email protected]
Sent: Tuesday, February 24, 2015 3:17:42 AM
Subject: Re: [Gmsh] If () Endif issues


On 24 Feb 2015, at 04:21, Danny Holstein <[email protected]> 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
[email protected]
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
[email protected]
http://www.geuz.org/mailman/listinfo/gmsh



_______________________________________________
gmsh mailing list
[email protected]
http://www.geuz.org/mailman/listinfo/gmsh

Reply via email to