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