Square to round transition

Need help, or want to share a macro? Post here!
Forum rules
Be nice to others! Respect the FreeCAD code of conduct!
jfc4120
Posts: 448
Joined: Sat Jul 02, 2022 11:16 pm

Square to round transition

Post by jfc4120 »

Code: Select all

OS: Windows 10 Version 2009
Word size of FreeCAD: 64-bit
Version: 0.20.29177 (Git)
Build type: Release
Branch: releases/FreeCAD-0-20
Hash: 68e337670e227889217652ddac593c93b5e8dc94
Python 3.8.10, Qt 5.15.2, Coin 4.0.1, Vtk 8.2.0, OCC 7.6.2
Locale: English/United States (en_US)
Installed mods: 
  * Help 1.0.3

I have a program I wrote in the late 90's that completely lays out a square to round transition duct. Image included. No drawing, it handles it through a Basic language. Has several dialogs where you enter number of segments, height, length, etc.

I am hoping someone can rewrite it in python for Freecad to do the same. And make it an add in macro (open source). I am in my 60's and have programmed Lisp, basicad, java, vba, php, javascript. I just don't want to have to learn python in order to do this.

If anyone is interested I will post the complete code. I used to work with analytic geometry problems back in the day quite often.


Note: image is half pattern, other half is on another layer.
Attachments
p1.png
p1.png (19.88 KiB) Viewed 1787 times
User avatar
johnwang
Veteran
Posts: 1345
Joined: Sun Jan 27, 2019 12:41 am

Re: Square to round transition

Post by johnwang »

I am very interested.
hfc series CAE workbenches for FreeCAD (hfcNastran95, hfcMystran, hfcFrame3DD, hfcSU2 and more)
jfc4120
Posts: 448
Joined: Sat Jul 02, 2022 11:16 pm

Re: Square to round transition

Post by jfc4120 »

@johnwang I have the above and another that you can draw a certain fitting, then set (click on) points bottom, then points top and it triangulates it out flat.

Very similar to Design2fab, but not as automatic (https://www.hypertherm.com/design2fab/sheetmetal). I have several basic fittings.

If I upload the file, are you willing to convert to a freecad python macro and share it back here and with anyone? It even handles off center and top circular being at an angle. Can even generate an xy coordinates for layout: More segments can be used if needed.

Code: Select all

FITTING lower
PT#        X         Y
  1       0.00      3.27
  2       6.75      0.00
  3      16.75      0.00
  4      26.75      0.00
  5      33.27      3.71
--------------------------

FITTING curve
PT#        X         Y
  1      10.10     24.15
  2      12.36     22.89
  3      14.54     21.50
  4      16.75     20.15
  5      19.12     19.09
  6      21.69     18.88
  7      24.15     19.69
--------------------------
Image of Rectangular to round offset and at an angle, half shown other half is generated on another layer and hidden.
Attachments
Screenshot 2022-07-19 005249.jpg
Screenshot 2022-07-19 005249.jpg (50.21 KiB) Viewed 1636 times
User avatar
johnwang
Veteran
Posts: 1345
Joined: Sun Jan 27, 2019 12:41 am

Re: Square to round transition

Post by johnwang »

Yes, I can change it to Python.
hfc series CAE workbenches for FreeCAD (hfcNastran95, hfcMystran, hfcFrame3DD, hfcSU2 and more)
jfc4120
Posts: 448
Joined: Sat Jul 02, 2022 11:16 pm

Re: Square to round transition

Post by jfc4120 »

@johnwang here is code:

Code: Select all

' SQRND.BSC
'SQRND.BSC AND SQUARE1.BSC ARE THE SAME
INPUT "HOW MANY SEGMENTS...?" S
INPUT "DIAMETER" D
INPUT "OFFSET R/L + IF RIGHT" ORL
INPUT "OFFSET F/B + IF BACK" OFB
INPUT "TURN ANGLE OF TOP + IF CCW: " ATU
INPUT "LENGTH" L
INPUT "WIDTH" W
INPUT "HEIGHT" H
R = D / 2
C = 3.1416*D
STP = 360/S
XP1 = L / 2 
XP2 = XP1 
XP3 = 0 
YP1 = 0 
YP2 = W / 2 
YP3 = YP2
'**************************FIRST SIDE
'************************ADDED
ENT = 0

XS1 = COS(0)* R
          DXS1 = COS(ATU) * XS1
          NXS1 = DXS1 + ORL
          Z = H
          DZ = SIN(ATU) * XS1
          NZ = Z + DZ
YS1 = (SIN(0) * R) + OFB
LS1 = SQRT(ABS(NXS1 - XP1) ^ 2 + ABS(YS1 - YP1) ^ 2 + ABS(NZ) ^ 2)
>LINE
{
<POINTXYZ 20,0,0
<POINTXYZ [(20+YP2),0,0]
}
LINE1 = SQRT(ABS(NXS1 - XP2) ^ 2 + ABS(YS1 - YP2) ^ 2 + ABS(NZ) ^ 2)
ANG1 = ACOS((ABS(LINE1) ^ 2 + ABS(YP2) ^ 2 - ABS(LS1) ^ 2 )/(2*LINE1*YP2))
>LINE
{
<POINTXYZ 20,0,0
<POINTPOLAR [LINE1, ANG1, 0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL QX1 QY1 QZ1 1 'FIRST POINTVAL ALSO VERTEX      
POINTVAL QX2 QY2 QZ2 2
>LINE
{
<POINTXYZ [(YP2+20),0,0]
<POINTXYZ [QX2, QY2, QZ2]
}
'FIRST QUAD    *****************************
'J = 1
TANG = 0
CHORD = D * SIN(STP/2)
' CHORD = D * SIN(STP/2)
FOR DEG = 0 TO 90 STEP STP
'DEG = DEG + STP
X1 = COS(DEG)* R 
          DX1 = COS(ATU) * X1
          NX1 = DX1 + ORL
          Z = H
          DZ = SIN(ATU) * X1
          NZ = Z + DZ
Y1 = (SIN(DEG)* R) + OFB
X11 = COS(DEG + STP)* R
          DX11 = COS(ATU) * X11
          NX11 = DX11 + ORL
          Z1 = H
          DZ1 = SIN(ATU) * X11
          NZ1 = Z1 + DZ1
Y11 = (SIN(DEG + STP)* R) + OFB
        IF (DEG + STP) > 90 THEN EXIT FOR
L1 = SQRT(ABS(NX1 - XP2) ^ 2 + ABS(Y1 - YP2) ^ 2 + ABS(NZ) ^ 2)  
L11 = SQRT(ABS(NX11 - XP2) ^ 2 + ABS(Y11 - YP2) ^ 2 + ABS(NZ1) ^ 2)  
ANGQ1 = ACOS((ABS(L11) ^ 2 + ABS(L1) ^ 2 - ABS(CHORD) ^ 2 )/(2*L11*L1))   
TANG = TANG + ANGQ1

>LINE
{
<POINTXYZ 20,0,0
<POINTPOLAR [L11, (ANG1 + TANG), 0]
}
NEXT
'************  FIRST BACK TRIANGLE     **********************************
LFB = L11
LANG = ANG1+TANG
XS2 = COS(90)* R 
           DXS2 = COS(ATU) * XS2
           NXS2 = DXS2 + ORL
           Z = H
           DZ = SIN(ATU) * XS2
           NZ = Z + DZ
YS2 = (SIN(90) * R) + OFB
LS2 = SQRT(ABS(NXS2 - XP3) ^ 2 + ABS(YS2 - YP3) ^ 2 + ABS(NZ) ^ 2)
ANGFB = ACOS((ABS(XP1) ^ 2 + ABS(LFB) ^ 2 - ABS(LS2) ^ 2 )/(2*XP1*LFB)) 
>LINE
{
<POINTXYZ 20,0,0
<POINTPOLAR [LFB, LANG, 0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL BX1 BY1 BZ1 2
>LINE
{
<POINTXYZ 20,0,0
<POINTPOLAR [XP1, (LANG + ANGFB), 0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL BX3 BY3 BZ3 2
>LINE
{
<POINTXYZ [BX1,BY1,BZ1]
<POINTXYZ [BX3,BY3,BZ3]
}
'**********  SECOND QUAD *****************
'XP4=-L/2,'YP4=YP3,'XP5=XP4,'YP5=0
>LINE
{
<POINTXYZ [BX3,BY3,BZ3]
<POINTPOLAR [XP1, (LANG + ANGFB) , 0]
<POINTXYZ [BX1,BY1,BZ1]
 }
ENT = SYS(9)
ENTITY ENT
POINTVAL CX2 CY2 CZ2 2
LNL = SQRT(ABS(BX1-CX2)^2 + ABS(BY1-CY2)^2)
XPLR = BX1 - CX2
YPLR = BY1 - CY2
GOSUB CHOICE

     'IF ANG4 < 0 THEN ANG4 = ANG4 + 180

'********** SECOND QUAD   *********************
TANG1 = 0
FOR DEG = 90 TO 180 STEP STP
X2 = COS(DEG)* R
          DX2 = COS(ATU) * X2
          NX2 = DX2 + ORL
          Z = H
          DZ = SIN(ATU) * X2
          NZ = Z + DZ
Y2 = (SIN(DEG) * R) + OFB
X22 = COS(DEG + STP) * R
          DX22 = COS(ATU) * X22
          NX22 = DX22 + ORL
          Z1 = H
          DZ1 = SIN(ATU) * X22
          NZ1 = Z1 + DZ1
Y22 = (SIN(DEG + STP)* R) + OFB
        IF (DEG + STP) > 180 THEN EXIT FOR
L2 =  SQRT(ABS(NX2- (-L/2)) ^ 2 + ABS(Y2 - YP2) ^ 2 + ABS(NZ) ^ 2)   
L22 = SQRT(ABS(NX22 - (-XP2)) ^ 2 + ABS(Y22 - YP2) ^ 2 + ABS(NZ1) ^ 2)   
ANGQ2 =  ACOS((ABS(L22) ^ 2 + ABS(L2) ^ 2 - ABS(CHORD) ^ 2 )/(2*L22*L2))  
TANG1 = TANG1 + ANGQ2
>LINE
{
<POINTXYZ [CX2, CY2, CZ2]
<POINTPOLAR [L22, (ANG4 + TANG1), 0]
}
NEXT
'*****************LAST TRIANGLE OF FIRST SECTION
LASTANG = ANG4 + TANG1
XS3 = COS(180)* R
          DXS3 = COS(ATU) * XS3
          NXS3 = DXS3 + ORL
          Z = H
          DZ = SIN(ATU) * XS3
          NZ = Z + DZ
YS3 = (SIN(180) * R) + OFB
LS3 = SQRT(ABS(NXS3 - (-L/2)) ^ 2 + ABS(YS1 - YP1) ^ 2 + ABS(NZ) ^ 2)
ANGLB = ACOS((ABS(W/2) ^ 2 + ABS(L22) ^ 2 - ABS(LS3) ^ 2 )/(2*(W/2)*L22)) 
>LINE
{
<POINTXYZ [CX2,CY2,CZ2]
<POINTPOLAR [L22, LASTANG, 0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL BX2 BY2 BZ2 2
>LINE
{
<POINTXYZ [CX2,CY2,CZ2]
<POINTPOLAR [(W/2), (LASTANG + ANGLB),0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL BX3 BY3 BZ3 2
>LINE
{
<POINTXYZ [BX3,BY3,BZ3]
<POINTXYZ [BX2,BY2,BZ2]
}

GOSUB SECOND

END
'****************END OD FIRST HALF
'***************** SECOND HALF
SECOND:
LAYER(10)=14
LAYER(1)=0
SYS(300)=255
SYS(301)=0
SYS(302)=0

>REGENERATE
{
}
S = S
D = D
ORL = -(ORL)
OFB = -(OFB)
ATU = -(ATU)
L = L
W = W
H = H
C = 3.1416*D
STP = 360/S
XP1 = L / 2 
XP2 = XP1 
XP3 = 0 
YP1 = 0 
YP2 = W / 2 
YP3 = YP2
'**************************FIRST SIDE
XS1 = COS(0)* R
          DXS1 = COS(ATU) * XS1
          NXS1 = DXS1 + ORL
          Z = H
          DZ = SIN(ATU) * XS1
          NZ = Z + DZ
YS1 = (SIN(0) * R) + OFB
LS1 = SQRT(ABS(NXS1 - XP1) ^ 2 + ABS(YS1 - YP1) ^ 2 + ABS(NZ) ^ 2)
>LINE
{
<POINTXYZ 20,0,0
<POINTXYZ [(20+YP2),0,0]
}
LINE1 = SQRT(ABS(NXS1 - XP2) ^ 2 + ABS(YS1 - YP2) ^ 2 + ABS(NZ) ^ 2)
ANG1 = ACOS((ABS(LINE1) ^ 2 + ABS(YP2) ^ 2 - ABS(LS1) ^ 2 )/(2*LINE1*YP2))
>LINE
{
<POINTXYZ 20,0,0
<POINTPOLAR [LINE1, ANG1, 0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL QX1 QY1 QZ1 1 'FIRST POINTVAL ALSO VERTEX      
POINTVAL QX2 QY2 QZ2 2
>LINE
{
<POINTXYZ [(YP2+20),0,0]
<POINTXYZ [QX2, QY2, QZ2]
}
'FIRST QUAD    *****************************
'J = 1
TANG = 0
CHORD = D * SIN(STP/2)
' CHORD = D * SIN(STP/2)
FOR DEG = 0 TO 90 STEP STP
'DEG = DEG + STP
X1 = COS(DEG)* R 
          DX1 = COS(ATU) * X1
          NX1 = DX1 + ORL
          Z = H
          DZ = SIN(ATU) * X1
          NZ = Z + DZ
Y1 = (SIN(DEG)* R) + OFB
X11 = COS(DEG + STP)* R
          DX11 = COS(ATU) * X11
          NX11 = DX11 + ORL
          Z1 = H
          DZ1 = SIN(ATU) * X11
          NZ1 = Z1 + DZ1
Y11 = (SIN(DEG + STP)* R) + OFB
        IF (DEG + STP) > 90 THEN EXIT FOR
L1 = SQRT(ABS(NX1 - XP2) ^ 2 + ABS(Y1 - YP2) ^ 2 + ABS(NZ) ^ 2)  
L11 = SQRT(ABS(NX11 - XP2) ^ 2 + ABS(Y11 - YP2) ^ 2 + ABS(NZ1) ^ 2)  
ANGQ1 = ACOS((ABS(L11) ^ 2 + ABS(L1) ^ 2 - ABS(CHORD) ^ 2 )/(2*L11*L1))   
TANG = TANG + ANGQ1

>LINE
{
<POINTXYZ 20,0,0
<POINTPOLAR [L11, (ANG1 + TANG), 0]
}
NEXT
'************  FIRST BACK TRIANGLE     **********************************
LFB = L11
LANG = ANG1+TANG
XS2 = COS(90)* R 
           DXS2 = COS(ATU) * XS2
           NXS2 = DXS2 + ORL
           Z = H
           DZ = SIN(ATU) * XS2
           NZ = Z + DZ
YS2 = (SIN(90) * R) + OFB
LS2 = SQRT(ABS(NXS2 - XP3) ^ 2 + ABS(YS2 - YP3) ^ 2 + ABS(NZ) ^ 2)
ANGFB = ACOS((ABS(XP1) ^ 2 + ABS(LFB) ^ 2 - ABS(LS2) ^ 2 )/(2*XP1*LFB)) 
>LINE
{
<POINTXYZ 20,0,0
<POINTPOLAR [LFB, LANG, 0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL BX1 BY1 BZ1 2
>LINE
{
<POINTXYZ 20,0,0
<POINTPOLAR [XP1, (LANG + ANGFB), 0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL BX3 BY3 BZ3 2
>LINE
{
<POINTXYZ [BX1,BY1,BZ1]
<POINTXYZ [BX3,BY3,BZ3]
}
'**********  SECOND QUAD *****************
'XP4=-L/2,'YP4=YP3,'XP5=XP4,'YP5=0
>LINE
{
<POINTXYZ [BX3,BY3,BZ3]
<POINTPOLAR [XP1, (LANG + ANGFB) , 0]
<POINTXYZ [BX1,BY1,BZ1]
 }
ENT = SYS(9)
ENTITY ENT
POINTVAL CX2 CY2 CZ2 2
LNL = SQRT(ABS(BX1-CX2)^2 + ABS(BY1-CY2)^2)
XPLR = BX1 - CX2
YPLR = BY1 - CY2
GOSUB CHOICE

     'IF ANG4 < 0 THEN ANG4 = ANG4 + 180

'********** SECOND QUAD   *********************
TANG1 = 0
FOR DEG = 90 TO 180 STEP STP
X2 = COS(DEG)* R
          DX2 = COS(ATU) * X2
          NX2 = DX2 + ORL
          Z = H
          DZ = SIN(ATU) * X2
          NZ = Z + DZ
Y2 = (SIN(DEG) * R) + OFB
X22 = COS(DEG + STP) * R
          DX22 = COS(ATU) * X22
          NX22 = DX22 + ORL
          Z1 = H
          DZ1 = SIN(ATU) * X22
          NZ1 = Z1 + DZ1
Y22 = (SIN(DEG + STP)* R) + OFB
        IF (DEG + STP) > 180 THEN EXIT FOR
L2 =  SQRT(ABS(NX2- (-L/2)) ^ 2 + ABS(Y2 - YP2) ^ 2 + ABS(NZ) ^ 2)   
L22 = SQRT(ABS(NX22 - (-XP2)) ^ 2 + ABS(Y22 - YP2) ^ 2 + ABS(NZ1) ^ 2)   
ANGQ2 =  ACOS((ABS(L22) ^ 2 + ABS(L2) ^ 2 - ABS(CHORD) ^ 2 )/(2*L22*L2))  
TANG1 = TANG1 + ANGQ2
>LINE
{
<POINTXYZ [CX2, CY2, CZ2]
<POINTPOLAR [L22, (ANG4 + TANG1), 0]
}
NEXT
'*****************LAST TRIANGLE OF FIRST SECTION
LASTANG = ANG4 + TANG1
XS3 = COS(180)* R
          DXS3 = COS(ATU) * XS3
          NXS3 = DXS3 + ORL
          Z = H
          DZ = SIN(ATU) * XS3
          NZ = Z + DZ
YS3 = (SIN(180) * R) + OFB
LS3 = SQRT(ABS(NXS3 - (-L/2)) ^ 2 + ABS(YS1 - YP1) ^ 2 + ABS(NZ) ^ 2)
ANGLB = ACOS((ABS(W/2) ^ 2 + ABS(L22) ^ 2 - ABS(LS3) ^ 2 )/(2*(W/2)*L22)) 
>LINE
{
<POINTXYZ [CX2,CY2,CZ2]
<POINTPOLAR [L22, LASTANG, 0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL BX2 BY2 BZ2 2
>LINE
{
<POINTXYZ [CX2,CY2,CZ2]
<POINTPOLAR [(W/2), (LASTANG + ANGLB),0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL BX3 BY3 BZ3 2
>LINE
{
<POINTXYZ [BX3,BY3,BZ3]
<POINTXYZ [BX2,BY2,BZ2]
}
RETURN

CHOICE:
ON ERROR GOTO ERHAN
ANG4 = ATAN(YPLR/XPLR)
ERHAN:    
RESUME DOCASE
DOCASE:

    IF XPLR > 0 AND YPLR = 0 THEN ANG4 = 0
    IF XPLR > 0 AND YPLR > 0 THEN ANG4 = ANG4
    IF XPLR < 0 AND YPLR > 0 THEN ANG4 = ANG4 + 180
    IF XPLR = 0 AND YPLR > 0 THEN ANG4 = 90
    IF XPLR > 0 AND YPLR < 0 THEN ANG4 = ANG4
    IF XPLR < 0 AND YPLR = 0 THEN ANG4 = 180
    IF XPLR < 0 AND YPLR < 0 THEN ANG4 = ANG4 - 180
    IF XPLR = 0 AND YPLR < 0 THEN ANG4 = -90
RETURN





Also the points file is a separate program, you run it, click on chosen points and they are stored in a text file.

please post back here when done.
User avatar
johnwang
Veteran
Posts: 1345
Joined: Sun Jan 27, 2019 12:41 am

Re: Square to round transition

Post by johnwang »

Code: Select all

ENT = SYS(9)
ENTITY ENT
POINTVAL QX1 QY1 QZ1 1 'FIRST POINTVAL ALSO VERTEX      
POINTVAL QX2 QY2 QZ2 2
How do I get these QX1 QY1 QZ1 value? Is it picked on screen or inputted from a file?
hfc series CAE workbenches for FreeCAD (hfcNastran95, hfcMystran, hfcFrame3DD, hfcSU2 and more)
jfc4120
Posts: 448
Joined: Sat Jul 02, 2022 11:16 pm

Re: Square to round transition

Post by jfc4120 »

pointval is storing the last points set for later use as needed.

Code: Select all

>LINE
{
<POINTXYZ 20,0,0
<POINTPOLAR [LINE1, ANG1, 0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL QX1 QY1 QZ1 1 
POINTVAL QX2 QY2 QZ2 2
Stores the 2 points from previous statement

Code: Select all

<POINTXYZ 20,0,0
<POINTPOLAR [LINE1, ANG1, 0]      These 2 points stored
}
ENT = SYS(9)
ENTITY ENT
POINTVAL QX1 QY1 QZ1 1 'FIRST POINTVAL ALSO VERTEX      
POINTVAL QX2 QY2 QZ2 2
>LINE                                             Line drawn after points stored.
That way the points can be used elsewhere as needed. But no external file used.
User avatar
johnwang
Veteran
Posts: 1345
Joined: Sun Jan 27, 2019 12:41 am

Re: Square to round transition

Post by johnwang »

Code: Select all

Qx1=20
Qy1=0
Qz1=0
Is that right?
Last edited by johnwang on Wed Jul 20, 2022 12:18 am, edited 2 times in total.
hfc series CAE workbenches for FreeCAD (hfcNastran95, hfcMystran, hfcFrame3DD, hfcSU2 and more)
edwilliams16
Veteran
Posts: 3106
Joined: Thu Sep 24, 2020 10:31 pm
Location: Hawaii
Contact:

Re: Square to round transition

Post by edwilliams16 »

Here's how you might do this within FreeCAD. Basically Make ruled surfaces by Part Lofts to a point. Convert to mesh, then unroll mesh.
Screen Shot 2022-07-19 at 1.25.32 PM.png
Screen Shot 2022-07-19 at 1.25.32 PM.png (23.16 KiB) Viewed 1485 times
Attachments
squaretocircle.FCStd
(60.52 KiB) Downloaded 52 times
jfc4120
Posts: 448
Joined: Sat Jul 02, 2022 11:16 pm

Re: Square to round transition

Post by jfc4120 »

@johnwang Yes, I ended program here:

Code: Select all

LINE1 = SQRT(ABS(NXS1 - XP2) ^ 2 + ABS(YS1 - YP2) ^ 2 + ABS(NZ) ^ 2)
ANG1 = ACOS((ABS(LINE1) ^ 2 + ABS(YP2) ^ 2 - ABS(LS1) ^ 2 )/(2*LINE1*YP2))
>LINE
{
<POINTXYZ 20,0,0
<POINTPOLAR [LINE1, ANG1, 0]
}
'added
END
'added
And so far on drawing you have:

And @edwilliams16 I am having a look. But The above is for a shop where you need to layout flat and have all coordinates.
Attachments
Screenshot 2022-07-19 191009.png
Screenshot 2022-07-19 191009.png (9.13 KiB) Viewed 1448 times
Post Reply