JimAndi Toolbox: Difference between revisions
No edit summary |
|||
(232 intermediate revisions by the same user not shown) | |||
Line 5: | Line 5: | ||
===ArrayClear=== | ===ArrayClear=== | ||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
ArrayClear - Clears the data from a data array. | |||
local tbl = {1, 2, 5, 6} | |||
tbl = ArrayClear(tbl) | |||
returns tbl = {} | |||
<nowiki> function ArrayClear(arrayName) | |||
function ArrayClear(arrayName) | |||
for _,v in ipairs(arrayName) do | for _,v in ipairs(arrayName) do | ||
table.remove(arrayName, i) | table.remove(arrayName, i) | ||
Line 17: | Line 19: | ||
return true | return true | ||
end -- function end </nowiki> | end -- function end </nowiki> | ||
---- | |||
===NameCheck=== | ===NameCheck=== | ||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | [[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | ||
Checks if Name is in the list of it is default name. | |||
a = {1, 2, 5, 6} | |||
Words = NameCheck(a, 5) -- returns true | |||
<nowiki> function NameCheck(Name, Defalt, ListName) | |||
if Name ~= Defalt then | if Name ~= Defalt then | ||
for i=1, ListName do | for i=1, ListName do | ||
Line 37: | Line 41: | ||
end | end | ||
end -- function end </nowiki> | end -- function end </nowiki> | ||
---- | |||
===RemoveDuplicates=== | ===RemoveDuplicates=== | ||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns table of unique items in "A" acending or "D" decending | |||
local tbl = {1, 2, 5, 3, 5, 6, 4} | |||
tbl = ArrayClear(tbl, "A") | |||
returns tbl = {1, 2, 3, 4, 5, 6} | returns tbl = {1, 2, 3, 4, 5, 6} | ||
<nowiki> function RemoveDuplicates(tab, order) | |||
local hashSet = {} | local hashSet = {} | ||
local new = {} | local new = {} | ||
Line 66: | Line 71: | ||
return new | return new | ||
end -- function end </nowiki> | end -- function end </nowiki> | ||
---- | |||
===RemoveTableItem=== | ===RemoveTableItem=== | ||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | [[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | ||
Returns table with item removed. | |||
local tbl = {1, 2, 3, 4, 5, 6} | |||
tbl = RemoveTableItem(tbl, 4) | |||
returns tbl = {1, 2, 3, 5, 6} | returns tbl = {1, 2, 3, 5, 6} | ||
function RemoveTableItem(tabName, tabItem) | <nowiki> function RemoveTableItem(tabName, tabItem) | ||
for x = 1 in ipairs(tabName) do | for x = 1 in ipairs(tabName) do | ||
if tabName[x] == tabItem then | if tabName[x] == tabItem then | ||
Line 86: | Line 92: | ||
return true | return true | ||
end -- function end </nowiki> | end -- function end </nowiki> | ||
---- | |||
===TableLength=== | ===TableLength=== | ||
Line 105: | Line 112: | ||
return count | return count | ||
end -- function end </nowiki> | end -- function end </nowiki> | ||
---- | |||
===FindDups=== | ===FindDups=== | ||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Find all duplicate items and returns two tables the dup and clean tables | |||
Returns table item count | |||
local tbl = {1, 2, 2, 4, 4, 6} | |||
local tbl1 = {} | |||
local tbl2 = {} | |||
tbl1, tbl2 = TableLength(tbl) | |||
returns tbl1, tbl2 = 6 | |||
<nowiki> function FindDups(checktbl, duptbl, cleantbl) | |||
function tLength(tbl) -- tLength returns table count | function tLength(tbl) -- tLength returns table count | ||
local count = 0 | local count = 0 | ||
Line 147: | Line 155: | ||
return table.sort(duptbl), table.sort(cleantbl) | return table.sort(duptbl), table.sort(cleantbl) | ||
end -- function end </nowiki> | end -- function end </nowiki> | ||
---- | |||
===ReverseTable=== | ===ReverseTable=== | ||
Line 152: | Line 162: | ||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | [[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | ||
Returns a reversed table | |||
local tbl = {1, 2, 3, 4, 5, 6} | |||
tbl = ReverseTable(tbl) | |||
returns tbl = {6, 5, 4, 3, 2, 1} | |||
<nowiki> function ReverseTable(tbl) | |||
--tbl = {7, 6, 7, A, 5, 4, 3, A, 2, 1} | --tbl = {7, 6, 7, A, 5, 4, 3, A, 2, 1} | ||
local n = #tbl | local n = #tbl | ||
Line 169: | Line 181: | ||
return tbl | return tbl | ||
end -- function end </nowiki> | end -- function end </nowiki> | ||
---- | |||
==Conversion Tools== | ==Conversion Tools== | ||
[[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | [[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | ||
This collection of conversion | This collection of functions that assist in the conversion activities. | ||
===Bool2Str=== | ===Bool2Str=== | ||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | [[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | ||
<nowiki> bool2Str - Converts true or false as a string. | |||
local x = true | local x = true | ||
tbl = bool2Str(x) | tbl = bool2Str(x) | ||
-- =====================================================]] | |||
returns "true" | returns "true" | ||
function Bool2Str(x) | function Bool2Str(x) | ||
if x then | if x then | ||
Line 188: | Line 201: | ||
return "false" | return "false" | ||
end | end | ||
end --function end < | end --function end </nowiki> | ||
---- | |||
===D2S8=== | ===D2S8=== | ||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | [[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | ||
<nowiki> D2S8 - Converts a Number (Double) to a String with 8 places | D2S8 - Converts a Number (Double) to a String with 8 places | ||
<nowiki>function D2S8(d) -- Converts a Number (Double) to a String with 8 places | |||
-- local x =12.2351 | |||
-- returns "12.23510000" | |||
-- =====================================================]] | -- =====================================================]] | ||
return string.format("%.8f", d) | return string.format("%.8f", d) | ||
end -- end function </nowiki> | end -- end function </nowiki> | ||
---- | |||
===D2S4=== | ===D2S4=== | ||
Line 215: | Line 229: | ||
return string.format("%.4f", d) | return string.format("%.4f", d) | ||
end -- end function </nowiki> | end -- end function </nowiki> | ||
---- | |||
===Toint=== | ===Toint=== | ||
Line 226: | Line 242: | ||
return math.floor(tonumber(number) or error("Could not cast '" .. tostring(number) .. "' to number.'")) | return math.floor(tonumber(number) or error("Could not cast '" .. tostring(number) .. "' to number.'")) | ||
end -- end function </nowiki> | end -- end function </nowiki> | ||
---- | |||
===Rounder=== | ===Rounder=== | ||
Line 236: | Line 254: | ||
return tonumber(string.format("%." .. (idp or 0) .. "f", num)) | return tonumber(string.format("%." .. (idp or 0) .. "f", num)) | ||
end -- end function </nowiki> | end -- end function </nowiki> | ||
---- | |||
===RUsame=== | ===RUsame=== | ||
Line 264: | Line 284: | ||
Retuns true if number is within tolerance with match | Retuns true if number is within tolerance with match | ||
<nowiki> function WithIn(Num, Mat, Tol) | <nowiki> function WithIn(Num, Mat, Tol) | ||
if ((Num >= (Mat - Tol)) and (Num <= (Mat + Tol))) then | if ((Num >= (Mat - Tol)) and (Num <= (Mat + Tol))) then | ||
return true | return true | ||
Line 271: | Line 291: | ||
return false | return false | ||
end -- end function </nowiki> | end -- end function </nowiki> | ||
---- | |||
===Double2Fraction=== | ===Double2Fraction=== | ||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | [[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | ||
Converts a Measurement (Double) to a Fractional String | |||
local txt = Double2Fraction(1.25) | |||
returns txt ="1-1/4" | |||
<nowiki> function Double2Fraction(Num) | |||
local Frac = "Error" | local Frac = "Error" | ||
if Num then | if Num then | ||
Line 449: | Line 474: | ||
return Frac | return Frac | ||
end -- end function </nowiki> | end -- end function </nowiki> | ||
---- | |||
==Time and Date Tools== | ==Time and Date Tools== | ||
[[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | [[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | ||
This | This collection of functions are utilized in the date and time calculations. | ||
===StartDateTime=== | ===StartDateTime=== | ||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | [[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | ||
StartDateTime - Returns the Date and Time. | |||
local dt= StartDateTime(true) | |||
returns tbl = "10/02/23" | |||
function StartDateTime(LongShort) | <nowiki> function StartDateTime(LongShort) | ||
--[[ Date Value Codes | --[[ Date Value Codes | ||
-- | | -- | %a abbreviated weekday name (e.g., Wed) | ||
-- | %A full weekday name (e.g., Wednesday) | -- | %A full weekday name (e.g., Wednesday) | ||
-- | %b abbreviated month name (e.g., Sep) | -- | %b abbreviated month name (e.g., Sep) | ||
Line 487: | Line 515: | ||
end | end | ||
end </nowiki> | end </nowiki> | ||
---- | |||
===StartDate=== | ===StartDate=== | ||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | [[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | ||
StartDate - Returns the Date and Time. | |||
local dt= StartDate(true) | |||
function StartDate(LongShort) | returns tbl = "10/02/23" | ||
<nowiki> function StartDate(LongShort) | |||
--[[ Date Value Codes | --[[ Date Value Codes | ||
-- | %a abbreviated weekday name (e.g., Wed) | -- | %a abbreviated weekday name (e.g., Wed) | ||
Line 523: | Line 553: | ||
end </nowiki> | end </nowiki> | ||
---- | |||
===Wait=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | [[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | ||
Wait - Waits for a duration. | |||
local dt = Wait(true) | |||
returns tbl = "10/02/23" | |||
<nowiki> function Wait(time) | |||
local duration = os.time() + time | local duration = os.time() + time | ||
while os.time() < duration do end | while os.time() < duration do end | ||
end | |||
end -- function end </nowiki> | end -- function end </nowiki> | ||
---- | |||
==Debugging Tools== | ==Debugging Tools== | ||
[[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | [[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | ||
This | This collection of functions assist in the debugging of code. | ||
===DMark - places a circle and notation to assist in geometry debugging=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Draws a circle and marks on the drawing for debugging purposes. | |||
call = DebugMarkPoint("Note: Hi", Pt1) | |||
<nowiki> | <nowiki> function DMark(Note, Pt) | ||
-- ==== Sub Function | |||
local function DrawCircle(job, Cpt, CircleRadius, LayerName) -- Draws a circle | local function DrawCircle(job, Cpt, CircleRadius, LayerName) -- Draws a circle | ||
local pa = Polar2D(Cpt, 180.0, CircleRadius) | local pa = Polar2D(Cpt, 180.0, CircleRadius) | ||
local pb = Polar2D(Cpt, 0.0, CircleRadius) | local pb = Polar2D(Cpt, 0.0, CircleRadius) | ||
Line 569: | Line 592: | ||
return true | return true | ||
end -- function end | end -- function end | ||
-- ==== | -- ==== | ||
local BubbleSize = 1.25 | local BubbleSize = 1.25 | ||
if not Project.DebugAngle then | if not Project.DebugAngle then | ||
Line 597: | Line 620: | ||
end | end | ||
return true | return true | ||
end -- function end | end -- function end </nowiki> | ||
-- ======= | |||
---- | |||
===StatusMessage=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Useage: (Type of Message, Dialog Header, Question or Message, Err No.) | |||
StatusMessage("Error", "Base Cabinet Settings", "Face Frame Bottom Rail Width - value cannot be 0.", "(9000)") | |||
Note: if the debug flag is on (true) a message box shows the message length, dialog size and error number | |||
<nowiki>function StatusMessage(Type, Header, Question, ErrorNumber) | |||
local dialog | local dialog | ||
local X = 460 | local X = 460 | ||
Line 651: | Line 679: | ||
end | end | ||
return true | return true | ||
end | end </nowiki> | ||
-- ======= | |||
---- | |||
===DebugMarkPoint=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Used in debugging drawing issues - Draws a Circle and Text at the provided point(x,y) | |||
call = DebugMarkPoint("Note: Hi", Pt1, 0.125, "Jim") | |||
<nowiki>function DebugMarkPoint(Note, Pt, Size, LayerName) | |||
if Size == nil then | if Size == nil then | ||
Size = 0.125 | Size = 0.125 | ||
Line 665: | Line 696: | ||
LayerName = "Debug" | LayerName = "Debug" | ||
end | end | ||
-- ==== Sub Function | |||
local function DrawCircle(job, Cpt, CircleRadius, LayerName) -- Draws a circle | local function DrawCircle(job, Cpt, CircleRadius, LayerName) -- Draws a circle | ||
local pa = Polar2D(Cpt, 180.0, CircleRadius) | local pa = Polar2D(Cpt, 180.0, CircleRadius) | ||
local pb = Polar2D(Cpt, 0.0, CircleRadius) | local pb = Polar2D(Cpt, 0.0, CircleRadius) | ||
Line 678: | Line 705: | ||
layer:AddObject(CreateCadContour(line), true) | layer:AddObject(CreateCadContour(line), true) | ||
return true | return true | ||
end -- function end | end -- sub function end | ||
-- ==== | -- ==== | ||
local job = VectricJob() | local job = VectricJob() | ||
local Pt1 = Polar2D(Pt, Project.DebugAngle, Size * 2.0) | local Pt1 = Polar2D(Pt, Project.DebugAngle, Size * 2.0) | ||
Line 693: | Line 720: | ||
DrawCircle(job, Pt, Size, LayerName) | DrawCircle(job, Pt, Size, LayerName) | ||
return true | return true | ||
end -- function end | end -- function end </nowiki> | ||
-- ======= | |||
---- | |||
===ShowDialogSize=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y vaalues. | |||
<nowiki> function ShowDialogSize() | |||
DisplayMessageBox(tostring(dialog.WindowWidth) .. " x " .. tostring(dialog.WindowHeight)) | DisplayMessageBox(tostring(dialog.WindowWidth) .. " x " .. tostring(dialog.WindowHeight)) | ||
end -- function end | end -- function end</nowiki> | ||
---- | |||
==Dialog and Menu Tools== | ==Dialog and Menu Tools== | ||
[[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | [[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | ||
This object is a name-value pair that represents a Document | This object is a name-value pair that represents a Document. | ||
===DialogSize=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y vaalues. | |||
<nowiki> function DialogSize(Str) -- Returns the X and Y value of the dialogue | |||
function DialogSize(Str) -- Returns the X and Y value of the dialogue | |||
local InText = string.find(string.upper(Str) , "X") | local InText = string.find(string.upper(Str) , "X") | ||
local DialogX = All_Trim(string.sub(Str, 1, InText - 1)) | local DialogX = All_Trim(string.sub(Str, 1, InText - 1)) | ||
local DialogY = All_Trim(string.sub(Str, InText + 1)) | local DialogY = All_Trim(string.sub(Str, InText + 1)) | ||
return tonumber(DialogX), tonumber(DialogY) | return tonumber(DialogX), tonumber(DialogY) | ||
end -- end | end -- function end</nowiki> | ||
-- ======= | |||
function ProgressBarAmount(TotalRecords, Record) -- Calculates the percent amount of progression based on total process | ---- | ||
===ProgressBarAmount=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y vaalues. | |||
<nowiki> function ProgressBarAmount(TotalRecords, Record) -- Calculates the percent amount of progression based on total process | |||
--[[ | --[[ | ||
local MyProgressBar | local MyProgressBar | ||
Line 732: | Line 762: | ||
MyProgressBar:Finished() -- Close Progress Bar | MyProgressBar:Finished() -- Close Progress Bar | ||
]] | ]] | ||
local X1 = (100.0 / TotalRecords) | |||
local X2 = X1 * Record | |||
local X3 = math.abs(X2) | |||
local X4 = (math.floor(X3)) | |||
return (math.floor(math.abs((100.0 / TotalRecords) * Record))) | |||
end -- function end | end -- function end</nowiki> | ||
-- ======= | |||
function OnLuaButton_InquiryGearCalulate(dialog) | ---- | ||
===OnLuaButton_InquiryGearCalulate=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y vaalues. | |||
<nowiki> function OnLuaButton_InquiryGearCalulate(dialog) | |||
Gear.Addendum = dialog:GetDoubleField("Gear.Addendum") | Gear.Addendum = dialog:GetDoubleField("Gear.Addendum") | ||
Gear.Dedendum = dialog:GetDoubleField("Gear.Dedendum") | Gear.Dedendum = dialog:GetDoubleField("Gear.Dedendum") | ||
Line 765: | Line 800: | ||
return true | return true | ||
end -- function end | end -- function end</nowiki> | ||
-- ======= | |||
function InquiryDropList(Header, Quest, DX, DY, DList) | ---- | ||
===InquiryDropList=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y vaalues. | |||
<nowiki> function InquiryDropList(Header, Quest, DX, DY, DList) | |||
--[[ | --[[ | ||
Drop list foe user input | Drop list foe user input | ||
Line 790: | Line 830: | ||
return dialog:GetDropDownListValue("ListBox") | return dialog:GetDropDownListValue("ListBox") | ||
end | end | ||
end | end -- function end</nowiki> | ||
-- ======= | |||
function InquiryFileBox(Header, Quest, DefaltPath) | ---- | ||
===InquiryFileBox=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y vaalues. | |||
<nowiki> function InquiryFileBox(Header, Quest, DefaltPath) | |||
--[[ | --[[ | ||
Dialog Box for user to pick a file | Dialog Box for user to pick a file | ||
Line 828: | Line 873: | ||
return dialog:GetTextField("ReadFile") | return dialog:GetTextField("ReadFile") | ||
end -- if end | end -- if end | ||
end -- function end</nowiki> | |||
-- ======= | |||
function InquiryPathBox(Header, Quest, DefaltPath) | ---- | ||
===InquiryPathBox=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y vaalues. | |||
<nowiki> function InquiryPathBox(Header, Quest, DefaltPath) | |||
--[[ | --[[ | ||
Number Box for user input with default value | Number Box for user input with default value | ||
Line 866: | Line 916: | ||
return dialog:GetTextField("DInput") | return dialog:GetTextField("DInput") | ||
end -- if end | end -- if end | ||
end -- function end | end -- function end</nowiki> | ||
-- ======= | |||
function InquiryAreYouSureYesNo(Header, Question1, Question2) | ---- | ||
===InquiryAreYouSureYesNo=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y vaalues. | |||
<nowiki> function InquiryAreYouSureYesNo(Header, Question1, Question2) | |||
--[[ | --[[ | ||
Drop list for user to input project info | Drop list for user to input project info | ||
Line 888: | Line 943: | ||
return true | return true | ||
end | end | ||
end | end -- function end</nowiki> | ||
-- ======= | |||
function InquiryDoubleBox(Header, Quest, DefaltN) | ---- | ||
===InquiryDoubleBox=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y vaalues. | |||
<nowiki> function InquiryDoubleBox(Header, Quest, DefaltN) | |||
--[[ | --[[ | ||
-- nquiryNumberBox for user input with default number value | -- nquiryNumberBox for user input with default number value | ||
Line 908: | Line 968: | ||
return dialog:GetDoubleField("NumberInput") | return dialog:GetDoubleField("NumberInput") | ||
end | end | ||
end -- function end | end -- function end</nowiki> | ||
-- ======= | |||
function InquiryIntegerBox(Header, Quest, DefaltI) | ---- | ||
===InquiryIntegerBox=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y vaalues. | |||
<nowiki> function InquiryIntegerBox(Header, Quest, DefaltI) | |||
--[[ | --[[ | ||
-- InquiryIntegerBox for user input with default number value | -- InquiryIntegerBox for user input with default number value | ||
Line 928: | Line 993: | ||
return dialog:GetIntegerField("IntegerInput") | return dialog:GetIntegerField("IntegerInput") | ||
end | end | ||
end -- function end | end -- function end</nowiki> | ||
-- ======= | |||
function InquiryTextgBox(Header, Quest, DefaltS) | ---- | ||
===InquiryTextgBox=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y vaalues. | |||
<nowiki> function InquiryTextgBox(Header, Quest, DefaltS) | |||
--[[ | --[[ | ||
-- InquiryStringBox for user input with default number value | -- InquiryStringBox for user input with default number value | ||
Line 948: | Line 1,018: | ||
return dialog:GetTextField("NumberInput") | return dialog:GetTextField("NumberInput") | ||
end | end | ||
end -- function end | end -- function end</nowiki> | ||
-- ======= | |||
function OnLuaButton_InquiryError(Message) | ---- | ||
===OnLuaButton_InquiryError=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y vaalues. | |||
<nowiki> function OnLuaButton_InquiryError(Message) | |||
--[[ | --[[ | ||
Provides user information on an Error | Provides user information on an Error | ||
Line 967: | Line 1,042: | ||
WriteRegistry() | WriteRegistry() | ||
return true | return true | ||
end | end -- function end</nowiki> | ||
-- ======= | |||
function PresentMessage(Header, Type, Line) | ---- | ||
===PresentMessage=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y vaalues. | |||
<nowiki> function PresentMessage(Header, Type, Line) | |||
--[[ | --[[ | ||
Provides user information on an Error | Provides user information on an Error | ||
Line 986: | Line 1,066: | ||
dialog:ShowDialog() | dialog:ShowDialog() | ||
return true | return true | ||
end | end -- function end</nowiki> | ||
-- ======= | |||
function OnLuaButton_InquiryAbout() | ===OnLuaButton_InquiryAbout=== | ||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y vaalues. | |||
<nowiki> function OnLuaButton_InquiryAbout() | |||
local myHtml = [[<html><head><title>About</title>]] .. DialogWindow.Style ..[[</head><body text = "#000000"><table width="680" border="0" cellpadding="0"> <tr> <td align="center" nowrap="nowrap" class="header1-c" id="SysName">Easy Cabinet Maker</td> </tr> <tr> <td align="center" nowrap="nowrap" id="Version" class="ver-c">Version</td> </tr> <tr> <td align="center" nowrap="nowrap"><hr></td> </tr> <tr> <td align="center" nowrap="nowrap" class="header2-c">Disclaimer</td> </tr> <tr> <td align="center" class="p1-l"><p class="p1-l">The ]] .. Dovetail.AppName .. [[ Gadget is a plugin for Vectric software, V-Carve Pro and Aspire.<br> Gadgets are an entirely optional add-in to Vectric's core software products.<br> They are provided 'as-is', without any express or implied warranty, and you make use of them entirely at your own risk.<br> In no event will the author(s) or Vectric Ltd. be held liable for any damages arising from their use.<br> <br> Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:<br> 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software.<br> * If you use this software in a product, an acknowledgement in the product documentation would be appreciated but is not required.<br> 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.<br> 3. This notice may not be removed or altered from any source distribution.<br> <br>The author heavily utilized the SDK documentation and supplied code samples in addition to the outstanding user community on the Vectric User forum.</p></td> </tr> <tr> <td align="center"><a href="https://forum.vectric.com" class="webLink-c">Vectric User Forum</a></td> </tr> <tr> <td align="center"><span class="header2-c">JimAndi</span></td> </tr> <tr> <td align="center"><span class="h1-c">Houston, TX.</span></td> </tr> <tr> <td><hr></td> </tr> <tr> <td width="30%" align="center" style = "width: 15%"><input id = "ButtonOK" class = "FormButton" name = "ButtonOK" type = "button" value = "OK"></td> </tr></table></body></html>]] | local myHtml = [[<html><head><title>About</title>]] .. DialogWindow.Style ..[[</head><body text = "#000000"><table width="680" border="0" cellpadding="0"> <tr> <td align="center" nowrap="nowrap" class="header1-c" id="SysName">Easy Cabinet Maker</td> </tr> <tr> <td align="center" nowrap="nowrap" id="Version" class="ver-c">Version</td> </tr> <tr> <td align="center" nowrap="nowrap"><hr></td> </tr> <tr> <td align="center" nowrap="nowrap" class="header2-c">Disclaimer</td> </tr> <tr> <td align="center" class="p1-l"><p class="p1-l">The ]] .. Dovetail.AppName .. [[ Gadget is a plugin for Vectric software, V-Carve Pro and Aspire.<br> Gadgets are an entirely optional add-in to Vectric's core software products.<br> They are provided 'as-is', without any express or implied warranty, and you make use of them entirely at your own risk.<br> In no event will the author(s) or Vectric Ltd. be held liable for any damages arising from their use.<br> <br> Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:<br> 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software.<br> * If you use this software in a product, an acknowledgement in the product documentation would be appreciated but is not required.<br> 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.<br> 3. This notice may not be removed or altered from any source distribution.<br> <br>The author heavily utilized the SDK documentation and supplied code samples in addition to the outstanding user community on the Vectric User forum.</p></td> </tr> <tr> <td align="center"><a href="https://forum.vectric.com" class="webLink-c">Vectric User Forum</a></td> </tr> <tr> <td align="center"><span class="header2-c">JimAndi</span></td> </tr> <tr> <td align="center"><span class="h1-c">Houston, TX.</span></td> </tr> <tr> <td><hr></td> </tr> <tr> <td width="30%" align="center" style = "width: 15%"><input id = "ButtonOK" class = "FormButton" name = "ButtonOK" type = "button" value = "OK"></td> </tr></table></body></html>]] | ||
local dialog = HTML_Dialog(true, myHtml, 720, 468, "About") | local dialog = HTML_Dialog(true, myHtml, 720, 468, "About") | ||
Line 996: | Line 1,079: | ||
Project.AboutXY = tostring(dialog.WindowWidth) .. " x " .. tostring(dialog.WindowHeight) | Project.AboutXY = tostring(dialog.WindowWidth) .. " x " .. tostring(dialog.WindowHeight) | ||
return true | return true | ||
end | end -- function end</nowiki> | ||
-- ======= | |||
function Color_HTML () | ---- | ||
===Color_HTML === | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y vaalues. | |||
<nowiki> function Color_HTML () | |||
MessageBox(" X = " .. tostring(dialog.WindowWidth) .. | MessageBox(" X = " .. tostring(dialog.WindowWidth) .. | ||
" Y = " .. tostring(dialog.WindowHeight) | " Y = " .. tostring(dialog.WindowHeight) | ||
Line 1,036: | Line 1,125: | ||
</table> | </table> | ||
]] -- end HTML | ]] -- end HTML | ||
end -- | end -- function end</nowiki> | ||
-- ======= | |||
function Style () | ---- | ||
===Style=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y vaalues. | |||
<nowiki> function Style() | |||
-- =====================================================]] | -- =====================================================]] | ||
DialogWindow.Style = [[ <style> | DialogWindow.Style = [[ <style> | ||
Line 1,329: | Line 1,424: | ||
} | } | ||
</style>]] | </style>]] | ||
end | end -- function end</nowiki> | ||
-- ======= | |||
function Orgin () -- Anchor Point | ---- | ||
===Orgin=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y vaalues. | |||
<nowiki> function Orgin() -- Anchor Point | |||
-- ================================ | -- ================================ | ||
DialogWindow.Orgin = [[<table><tr><td colspan="2" class="h2-l">Anchor Point</td></tr><tr class="MyLeft"><td class="MyLeft"><table class="MyCenter"><tr><td><input type="radio" name="DrawingOrigin" checked="checked" value="V1"></td><td><hr></td><td valign="top"><input type="radio" name="DrawingOrigin" checked="checked" value="V2"></td></tr><tr><td class="auto-style9">|</td><td><input type="radio" name="DrawingOrigin" checked="checked" value="V3"></td><td valign="top">|</td></tr><tr><td><input type="radio" name="DrawingOrigin" checked="checked" value="V4"></td><td><hr></td><td valign="top"><input type="radio" name="DrawingOrigin" checked="checked" value="V5"></td></tr></table></td><td width="81%"><table><tr class="MyLeft"><td>X</td><td><input name="OriginX0" type="text" id="OriginX" size="8" maxlength="8"></td></tr><tr class="MyLeft"><td>Y</td><td><input name="OriginY0" type="text" id="OriginY" size="8" maxlength="8"></td></tr></table></td></tr></table>]] | DialogWindow.Orgin = [[<table><tr><td colspan="2" class="h2-l">Anchor Point</td></tr><tr class="MyLeft"><td class="MyLeft"><table class="MyCenter"><tr><td><input type="radio" name="DrawingOrigin" checked="checked" value="V1"></td><td><hr></td><td valign="top"><input type="radio" name="DrawingOrigin" checked="checked" value="V2"></td></tr><tr><td class="auto-style9">|</td><td><input type="radio" name="DrawingOrigin" checked="checked" value="V3"></td><td valign="top">|</td></tr><tr><td><input type="radio" name="DrawingOrigin" checked="checked" value="V4"></td><td><hr></td><td valign="top"><input type="radio" name="DrawingOrigin" checked="checked" value="V5"></td></tr></table></td><td width="81%"><table><tr class="MyLeft"><td>X</td><td><input name="OriginX0" type="text" id="OriginX" size="8" maxlength="8"></td></tr><tr class="MyLeft"><td>Y</td><td><input name="OriginY0" type="text" id="OriginY" size="8" maxlength="8"></td></tr></table></td></tr></table>]] | ||
end -- | end -- function end</nowiki> | ||
-- ======= | |||
function GetColor(str) -- returns the RGB value for the standard color names | ---- | ||
===GetColor=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y vaalues. | |||
<nowiki> function GetColor(str) -- returns the RGB value for the standard color names | |||
-- str = "Purple" | -- str = "Purple" | ||
-- returns = 128 0 128 | -- returns = 128 0 128 | ||
Line 1,366: | Line 1,472: | ||
end | end | ||
return Red, Green, Blue | return Red, Green, Blue | ||
end -- function end</nowiki> | |||
-- ======= | |||
function StatusMessage(Type, Header, Question, length) -- Standardize messaging dialogues | ---- | ||
===StatusMessage=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y vaalues. | |||
<nowiki> function StatusMessage(Type, Header, Question, length) -- Standardize messaging dialogues | |||
-- StatusMessage("Alert", "Alert Test", "This is a test of Alert", 165) | -- StatusMessage("Alert", "Alert Test", "This is a test of Alert", 165) | ||
-- StatusMessage("Question", "Question Test", "This is a test of Question", 165) | -- StatusMessage("Question", "Question Test", "This is a test of Question", 165) | ||
Line 1,401: | Line 1,513: | ||
dialog:ShowDialog() | dialog:ShowDialog() | ||
return true | return true | ||
end | end -- function end </nowiki> | ||
-- | |||
===DialogStringChecks=== | |||
<nowiki>function DialogStringChecks() | |||
local MyTrue = false | |||
if Milling.LNBottomProfile == "" then | |||
MessageBox("Error: Bottom Profile layer name cannot be blank") | |||
OnLuaButton_InquiryLayers() | |||
elseif Milling.LNSideProfile == "" then | |||
MessageBox("Error: Side Profile layer name cannot be blank") | |||
OnLuaButton_InquiryLayers() | |||
elseif Milling.LNSidePocket == "" then | |||
MessageBox("Error: Side Pocket layer name cannot be blank") | |||
OnLuaButton_InquiryLayers() | |||
elseif Milling.LNFrontProfile == "" then | |||
MessageBox("Error: Front Profile layer name cannot be blank") | |||
OnLuaButton_InquiryLayers() | |||
elseif Milling.LNFrontPocket == "" then | |||
MessageBox("Error: Front Pocket layer name cannot be blank") | |||
OnLuaButton_InquiryLayers() | |||
elseif Milling.LNBackProfile == "" then | |||
MessageBox("Error: Back Profile layer name cannot be blank") | |||
OnLuaButton_InquiryLayers() | |||
elseif Milling.LNBackPocket == "" then | |||
MessageBox("Error: Back Pocket layer name cannot be blank") | |||
OnLuaButton_InquiryLayers() | |||
elseif Milling.LNDrawNotes == "" then | |||
MessageBox("Error: Draw Notes layer name cannot be blank") | |||
OnLuaButton_InquiryLayers() | |||
elseif Milling.LNPartLabels == "" then | |||
MessageBox("Error: Part Lables layer name cannot be blank") | |||
OnLuaButton_InquiryLayers() | |||
elseif Milling.LNBlume == "" then | |||
MessageBox("Error: Blume layer name cannot be blank") | |||
OnLuaButton_InquiryLayers() | |||
elseif Project.ProjectName == "" then | |||
MessageBox("Error: Project Name cannot be blank") | |||
OnLuaButton_InquiryProjectInfo() | |||
elseif Project.ContactEmail == "" then | |||
MessageBox("Error: Contact Email cannot be blank") | |||
OnLuaButton_InquiryProjectInfo() | |||
elseif Project.ContactName == "" then | |||
MessageBox("Error: Contact Name cannot be blank") | |||
OnLuaButton_InquiryProjectInfo() | |||
elseif Project.ContactPhoneNumber == "" then | |||
MessageBox("Error: Project Name cannot be blank") | |||
OnLuaButton_InquiryProjectInfo() | |||
elseif Project.DrawerID == "" then | |||
MessageBox("Error: Contact Phone Number cannot be blank") | |||
OnLuaButton_InquiryProjectInfo() | |||
elseif Project.ProjectPath == "" then | |||
MessageBox("Error: Project Path cannot be blank") | |||
OnLuaButton_InquiryProjectInfo() | |||
else | |||
MyTrue = true | |||
end -- if end | |||
return MyTrue | |||
end -- function end</nowiki> | |||
---- | |||
-- | |||
- | |||
==Directory and File Tools== | |||
[[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | |||
This object is a name-value pair that represents a Document. | |||
---- | |||
===MakeFolder()=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y values. | |||
<nowiki> function MakeFolder(xPath) | |||
os.execute( "mkdir " .. xPath) | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
<nowiki> | ===PathFix()=== | ||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
<nowiki> function PathFix(xPath) -- Returns path with / | |||
return string.gsub(xPath, "\\", "/") | |||
end -- function end</nowiki> | |||
---- | |||
===IsDir()=== | |||
Validates a directory path | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
<nowiki>function IsDir(path) -- Returns true if path is found | |||
local function exists(file) | |||
local ok, err, code = os.rename(file, file) | |||
if not ok then | |||
< | if code == 13 then | ||
return true | |||
end -- if end | |||
end -- if end | |||
return ok, err | |||
end -- function end | |||
return exists(path.."/") | |||
end -- function end</nowiki> | |||
---- | |||
===FileExists()=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns Dialog size in a message box showing the X and Y values. | |||
<nowiki> function FileExists(name) | |||
-- FileExists(name | |||
-- DisplayMessageBox(name) | |||
local f=io.open(name,"r") | |||
if f~=nil then | |||
io.close(f) | |||
return true | |||
else | |||
return false | |||
end | |||
end -- function end</nowiki> | |||
---- | |||
===DirectoryProcessor()=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Returns number of files that were processed by an operation. | |||
<nowiki> function DirectoryProcessor(job, dir_name, filter, do_sub_dirs, function_ptr) | |||
local num_files_processed = 0 | |||
local directory_reader = DirectoryReader() | |||
local cur_dir_reader = DirectoryReader() | |||
directory_reader:BuildDirectoryList(dir_name, do_sub_dirs) | |||
directory_reader:SortDirs() | |||
local number_of_directories = directory_reader:NumberOfDirs() | |||
for i = 1, number_of_directories do | |||
local cur_directory = directory_reader:DirAtIndex(i) | |||
-- get contents of current directory | |||
-- dont include sub dirs, use passed filter | |||
cur_dir_reader:BuildDirectoryList(cur_directory.Name, false) | |||
cur_dir_reader:GetFiles(filter, true, false) | |||
-- call passed method for each file: | |||
local num_files_in_dir = cur_dir_reader:NumberOfFiles() | |||
for j=1, num_files_in_dir do | |||
local file_info = cur_dir_reader:FileAtIndex(j) | |||
if not function_ptr(job, file_info.Name) then | |||
return true | |||
<nowiki> | end -- if end | ||
num_files_processed = num_files_processed + 1 | |||
end -- for end | |||
-- empty out our directory object ready for next go | |||
cur_dir_reader:ClearDirs() | |||
cur_dir_reader:ClearFiles() | |||
end -- for end | |||
return num_files_processed | |||
end -- function end </nowiki> | |||
---- | |||
==Drawing Tools== | |||
[[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | |||
This object is a name-value pair that represents a Document Variable within a [[VectricJob]]. | |||
---- | |||
===DrawArrowLineArrow=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Draws a dimension line with arrow heads and extension leaders | |||
<nowiki>function DrawArrowLineArrow(Pt1, Ext1, Pt2, Ext2, Off, Str, Layer, scale) | |||
-- DrawArrowLineArrow(pt1, true, pt3, true, 2.5, "122.5", "TestLayer", 6.0) -- both | |||
-- DrawArrowLineArrow(pt1, true, pt3, false, 2.5, "122.5", "TestLayer", 6.0) -- first leader only | |||
-- DrawArrowLineArrow(pt1, false, pt3, true, 2.5, "122.5", "TestLayer", 6.0) -- second leader only | |||
-- -----------------------------------------------------]] | |||
local job = VectricJob() | |||
if not job.Exists then | |||
DisplayMessageBox("Error: No job loaded") | |||
return false | |||
end -- if end | |||
local DimArrow1Angle = GetPolarDirection(Pt1, Pt2, Polar2D(Pt2, 0.0, 1.0)) | |||
local DimArrow2Angle = DimArrow1Angle + 180.0 | |||
local LederAng = DimArrow1Angle + 90.0 | |||
local LedDrop = LederAng + 180.0 | |||
local TxtCenter = GetDistance(Pt1, Pt2) * 0.5 | |||
local ArrowLen = 0.125 * scale | |||
local StrSet = (string.len(Str) * ArrowLen) * 0.5 | |||
local PT01A = Polar2D(Pt1, LederAng, ArrowLen * 2.0) | |||
local PT02A = Polar2D(PT01A, LederAng, Off) | |||
local PT03A = Polar2D(PT02A, LederAng, ArrowLen) | |||
local PT01B = Polar2D(Pt2, LederAng, ArrowLen * 2.0) | |||
local PT02B = Polar2D(PT01B, LederAng, Off) | |||
local PT03B = Polar2D(PT02B, LederAng, ArrowLen) | |||
local Apt1 = Polar2D(PT02A, DimArrow1Angle + 15.0, ArrowLen) | |||
local Apt2 = Polar2D(PT02A, DimArrow1Angle - 15.0, ArrowLen) | |||
local TxtPt1 = Polar2D(Polar2D(PT02A, DimArrow1Angle, TxtCenter), DimArrow1Angle + 90.0, ArrowLen) | |||
local TxtPt = Polar2D(TxtPt1, DimArrow2Angle, StrSet) | |||
local ArrowHead = (ArrowLen * 0.333) | |||
local line1 = Contour(0.0) | |||
local layer1 = job.LayerManager:GetLayerWithName(Layer) | |||
line1:AppendPoint(Apt1) | |||
line1:LineTo(PT02A) | |||
line1:LineTo(Apt2) | |||
line1:LineTo(Apt1) | |||
layer1:AddObject(CreateCadContour(line1), true) | |||
local Apt3 = Polar2D(PT02B, DimArrow2Angle + 15.0, ArrowLen) | |||
local Apt4 = Polar2D(PT02B, DimArrow2Angle - 15.0, ArrowLen) | |||
local line2 = Contour(0.0) | |||
local layer2 = job.LayerManager:GetLayerWithName(Layer) | |||
line2:AppendPoint(Apt3) | |||
line2:LineTo(PT02B) | |||
line2:LineTo(Apt4) | |||
line2:LineTo(Apt3) | |||
layer2:AddObject(CreateCadContour(line2), true) | |||
if Ext1 then | |||
local lineA = Contour(0.0) | |||
local layerA = job.LayerManager:GetLayerWithName(Layer) | |||
lineA:AppendPoint(PT01A) | |||
lineA:LineTo(PT03A) | |||
layerA:AddObject(CreateCadContour(lineA), true) | |||
end -- if end | |||
if Ext2 then | |||
local lineB = Contour(0.0) | |||
local layerB = job.LayerManager:GetLayerWithName(Layer) | |||
lineB:AppendPoint(PT01B) | |||
lineB:LineTo(PT03B) | |||
layerB:AddObject(CreateCadContour(lineB), true) | |||
end -- if end | |||
local lineC = Contour(0.0) | |||
local layerC = job.LayerManager:GetLayerWithName(Layer) | |||
lineC:AppendPoint(PT02A) | |||
lineC:LineTo(PT02B) | |||
layerC:AddObject(CreateCadContour(lineC), true) | |||
DrawWriter(Double2Fraction(Str), TxtPt, ArrowLen, Layer, DimArrow1Angle) | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
===LayerClear=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Deletes Layer if empty. | |||
<nowiki>function LayerClear(LayerName) | |||
local Mylayer = Milling.job.LayerManager:GetLayerWithName(LayerName) | |||
if Mylayer.IsEmpty then | |||
Milling.job.LayerManager:RemoveLayer(Mylayer) | |||
end -- if end | |||
return true | return true | ||
end -- function end</nowiki> | |||
---- | |||
===LeaderLine=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
<nowiki>function DrawLeader(Pt1, Pt2, Pt3, Str, Layer, scale) --Draws a leader with text | |||
--[[ | |||
DrawLeader(pt1, pt2, "122.5", "TestLayer", 6.0) | |||
--]] | |||
local job = VectricJob() | |||
if not job.Exists then | |||
DisplayMessageBox("Error: No job loaded") | |||
return false | |||
end -- if end | |||
local ArrowLen = 0.125 * scale | |||
local DimArrowAngle = GetPolarDirection(Pt1, Pt2, Polar2D(Pt2, 0.0, 1.0)) | |||
local TxtAngle = GetPolarDirection(Pt2, Pt3, Polar2D(Pt3, 0.0, 1.0)) | |||
local TxtPt = Polar2D(Polar2D(Pt3, TxtAngle, ArrowLen), TxtAngle-45, H(ArrowLen)) | |||
local Apt1 = Polar2D(Pt1, DimArrowAngle + 15.0, ArrowLen) | |||
local Apt2 = Polar2D(Pt1, DimArrowAngle - 15.0, ArrowLen) | |||
local ArrowHead = ArrowLen * 0.333 | |||
local line1 = Contour(0.0) | |||
local layer1 = job.LayerManager:GetLayerWithName(Layer) | |||
line1:AppendPoint(Pt1) | |||
line1:LineTo(Apt2) ; line1:LineTo(Apt1) ; line1:LineTo(Pt1) | |||
layer1:AddObject(CreateCadContour(line1), true) | |||
local lineC = Contour(0.0) | |||
<nowiki> | local layerC = job.LayerManager:GetLayerWithName(Layer) | ||
lineC:AppendPoint(Pt1) | |||
lineC:LineTo(Pt2) | |||
lineC:LineTo(Pt3) | |||
layerC:AddObject(CreateCadContour(lineC), true) | |||
if IsAllNumber(Str) then | |||
DrawWriter(Double2Fraction(Str), TxtPt, ArrowLen, Layer, TxtAngle) | |||
else | |||
DrawWriter(Str, TxtPt, ArrowLen, Layer, TxtAngle) | |||
end -- if end | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
===Scale=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Provides the correct scale rate-based drawing units. | |||
<nowiki>function Scale(Num) | |||
local mtl_block = MaterialBlock() | |||
if mtl_block.InMM then | |||
return Num * 25.4 | |||
else | |||
return Num | |||
end | |||
end -- function end</nowiki> | |||
---- | |||
===AssyHoler=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Draws Assy Holes in a stright line (Rabbet and/or Dado). | |||
<nowiki>function AssyHoler(pt1, pt2, PartName) -- Draws Assy Holes in a stright line | |||
local Ang1 = GetPolarDirection(pt1, pt2) | |||
local Ang2 = GetPolarDirection(pt2, pt1) | |||
pt1 = Polar2D(pt1, Ang1, Milling.AssemblyHoleStartEnd) | |||
DrawCircle(pt1, Milling.AssemblyHoleRad, Milling.LNAssemblyHole .. PartName) | |||
pt2 = Polar2D(pt2, Ang2, Milling.AssemblyHoleStartEnd) | |||
DrawCircle(pt2, Milling.AssemblyHoleRad, Milling.LNAssemblyHole .. PartName) | |||
local Dist = GetDistance(pt1, pt2) | |||
if Project.Debugger then | |||
DMark("pt1", pt1) | |||
DMark("pt2", pt2) | |||
end -- if end | |||
BaseScrew(2) | |||
Milling.AssemblyHoleSpace = ((Milling.AssemblyHoleMaxSpace + Milling.AssemblyHoleMinSpace) * 0.5) | |||
HoleCount = Round(math.floor(Dist / Milling.AssemblyHoleSpace)) | |||
HoleSpacing = (Dist / HoleCount) | |||
HoleCount = (Dist / HoleSpacing) | |||
if (Dist > (HoleSpacing * 2.0)) then | |||
for i = HoleCount, 1, -1 do | |||
pt1 = Polar2D(pt1, Ang1, HoleSpacing) | |||
DrawCircle(pt1, Milling.AssemblyHoleRad, Milling.LNAssemblyHole .. PartName) | |||
if Project.Debugger then | |||
> DMark("pt1w", pt1) | |||
end -- if end | |||
BaseScrew(1) | |||
end -- for end | |||
elseif (Dist > HoleSpacing) then | |||
ptC = Polar2D(pt1, Ang1, Dist / 2.0) | |||
if Project.Debugger then | |||
DMark("ptC", ptC) | |||
end -- if end | |||
DrawCircle(ptC, Milling.AssemblyHoleRad, Milling.LNAssemblyHole .. PartName) | |||
else | |||
-- Done No Holes | |||
end -- if end | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
== | ===DrawBoneCenter2Pts=== | ||
[[File: | [[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | ||
Draws dog bone joints. | |||
<nowiki>function DrawBoneCenter2Pts(pt1, pt2, SlotWidth, BitRadius) | |||
Local Project = {} | |||
Project.job = VectricJob() | |||
Project.ang = GetPolarDirection(pt1, pt2) | |||
Project.dis = H(SlotWidth) | |||
Project.bit = math.sin(math.rad(45.0)) * BitRadius | |||
Project.ptA = Polar2D(pt1, Project.ang + 90.0, Project.dis) | |||
Project.ptAa = Polar2D(Project.ptA, Project.ang, Project.bit) | |||
Project.ptAb = Polar2D(Project.ptA, Project.ang + 270.0, Project.bit) | |||
Project.ptB = Polar2D(pt1, Project.ang + 270.0, Project.dis) | |||
Project.ptBa = Polar2D(Project.ptB, Project.ang + 90.0, Project.bit) | |||
Project.ptBb = Polar2D(Project.ptB, Project.ang, Project.bit) | |||
Project.ptC = Polar2D(pt2, Project.ang + 270.0, Project.dis) | |||
Project.ptCa = Polar2D(Project.ptC, Project.ang + 90.0, Project.bit) | |||
Project.ptCb = Polar2D(Project.ptC, Project.ang - 180.0, Project.bit) | |||
Project.ptD = Polar2D(pt2, Project.ang + 90.0, Project.dis) | |||
Project.ptDa = Polar2D(Project.ptD, Project.ang - 180.0, Project.bit) | |||
Project.ptDb = Polar2D(Project.ptD, Project.ang + 270.0, Project.bit) | |||
Project.line = Contour(0.0) | |||
Project.layer = Project.job.LayerManager:GetLayerWithName("DogBone") | |||
Project.line:AppendPoint(Project.ptAa) | |||
Project.line:ArcTo(Project.ptAb, 1.0) | |||
Project.line:LineTo(Project.ptBa) | |||
Project.line:ArcTo(Project.ptBb, 1.0) | |||
Project.line:LineTo(Project.ptCb) | |||
Project.line:ArcTo(Project.ptCa, 1.0) | |||
Project.line:LineTo(Project.ptDb) | |||
Project.line:ArcTo(Project.ptDa, 1.0) | |||
Project.line:LineTo(Project.ptAa) | |||
Project.layer:AddObject(CreateCadContour(Project.line), true) | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
===InsideCornerNipper=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Draws the nipping of a corner for easy fitting. | |||
<nowiki>function InsideCornerNipper(AngPlung, BitRadius, CornerPt) | |||
local NipLength = math.sin(math.rad(45.0)) * ((BitRadius + 0.04) * 2.0) | |||
local Pt1, Pt2 = Point2D() | |||
if Material.Orientation == "V" then | |||
Pt1 = Polar2D(CornerPt, (AngPlung + 90.0) - 45.0, NipLength) | |||
Pt2 = Polar2D(CornerPt, (AngPlung + 90.0) + 45.0, NipLength) | |||
else | |||
Pt1 = Polar2D(CornerPt, (AngPlung + 180.0) - 45.0, NipLength) | |||
Pt2 = Polar2D(CornerPt, (AngPlung + 180.0) + 45.0, NipLength) | |||
end | |||
return Pt1, Pt2 | |||
end -- function end</nowiki> | |||
---- | |||
===AddGroupToJob=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Builds a Grouping from the layer selection. | |||
<nowiki>function AddGroupToJob(job, group, layer_name) | |||
--[[ --------------- AddGroupToJob --------------------------------------------------| | |||
| Add passed group to the job - returns object created | |||
| Parameters: | |||
| job -- job we are working with | |||
| group -- group of contours to add to document | |||
| layer_name -- name of layer group will be created on| | |||
| Return Values: | |||
| object created to represent group in document | |||
]] | |||
-- create a CadObject to represent the group | |||
local cad_object = CreateCadGroup(group); | |||
-- create a layer with passed name if it doesnt already exist | |||
local layer = job.LayerManager:GetLayerWithName(layer_name) | |||
-- and add our object to it | |||
layer:AddObject(cad_object, true) | |||
return cad_object | |||
end -- function end</nowiki> | |||
---- | |||
===DrawArc=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Draws an Arc from points provided. | |||
<nowiki>function DrawArc(PtS, PtE, ArcRadius, Layer) | |||
--[[Draw Arc | |||
function | function main(script_path) | ||
-- | local MyPt1 = Point2D(3.5,3.8) | ||
function | local MyPt2 = Point2D(3.5,6.8) | ||
local layer = "My Arc" | |||
DrawArc(MyPt1, MyPt2, -0.456, Layer) | |||
return true | |||
end -- function end | |||
-- -----------------------------------------------------]] | |||
local job = VectricJob() | |||
if not job.Exists then | |||
DisplayMessageBox("Error: No job loaded") | |||
return false | |||
end -- function end | end | ||
-- | local line = Contour(0.0) | ||
local layer = job.LayerManager:GetLayerWithName(Layer) | |||
line:AppendPoint(PtS) | |||
line:ArcTo(PtE,1); | |||
layer:AddObject(CreateCadContour(line), true) | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
===DrawEllipse=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Draws a DrawEllipse from points provided. | |||
<nowiki>function DrawEllipse(CenterPt, LongAxe, ShortAxe, Layer) | |||
local LongAngle = 90.0 | |||
local ValueAB = (LongAxe - ShortAxe) * 0.50 | |||
local ValueAC = ValueAB * math.cos(math.rad(LongAngle)) | |||
local job = VectricJob() | |||
local LRad = LongAxe * 0.50 | |||
local ptT = Polar2D(CenterPt, LongAngle, LRad) | |||
local X = 0.0 | |||
local pty = Point2D(0.0,0.0) | |||
local ptx = Point2D(0.0,0.0) | |||
local mylayer = job.LayerManager:GetLayerWithName(Layer) | |||
local line = Contour(0.0) | |||
line:AppendPoint(ptT) | |||
while (X < 360.0) do | |||
pty = Polar2D(CenterPt, LongAngle + X, LRad) | |||
ValueAC = ValueAB * math.cos(math.rad(LongAngle + X)) | |||
if ((LongAngle + X) >= 90.0) then | |||
ptx = Polar2D(pty, 180.0, ValueAC) | |||
else | else | ||
ptx = Polar2D(pty, 0.0, ValueAC) | |||
end | |||
line:LineTo(ptx) | |||
X = X + 1 | |||
end -- while end | |||
line:LineTo(ptT) | |||
mylayer:AddObject(CreateCadContour(line), true) | |||
return true | |||
end -- function end</nowiki> | |||
end -- | |||
---- | |||
===DrawEllipse1=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Draws a DrawEllipse from points provided. | |||
== | <nowiki>function DrawEllipse1(DrawEllipse_CenterPt, DrawEllipse_LongAxe, DrawEllipse_ShortAxe, DrawEllipse_LongAxeAngle, DrawEllipse_Layer) | ||
-- ---------------------------------------------------]] | |||
function H(x) -- Returns half the value | |||
return x * 0.5 | |||
end -- function end | |||
-- ---------------------------------------------------]] | |||
function Polar2D(pt, ang, dis) -- Calculate a new point based on reference point, angle and distance. | |||
-- Returns a 2Dpoint(x, y) | |||
return Point2D((pt.X + dis * math.cos(math.rad(ang))), (pt.Y + dis * math.sin(math.rad(ang)))) | |||
end -- End Function | |||
-- ---------------------------------------------------]] | |||
function GetDistance(objA, objB) | |||
local xDist = objB.x - objA.x | |||
local yDist = objB.y - objA.y | |||
return math.sqrt((xDist ^ 2) + (yDist ^ 2)) | |||
end -- function end | |||
-- ---------------------------------------------------]] | |||
function Radius2Bulge (p1, p2, Rad) | |||
local chord = math.sqrt(((p2.x - p1.x) ^ 2) + ((p2.y - p1.y) ^ 2)) | |||
local seg = (Rad - (0.5 * (math.sqrt((4.0 * Rad^2) - chord^2)))) | |||
local bulge = (2 * seg) / chord | |||
return bulge | |||
end -- function end | |||
-- ---------------------------------------------------]] | |||
function GetPolarAngle(Start, Corner, End) | |||
local function GetPolarDirection(point1, point2) -- | |||
local ang = math.abs(math.deg(math.atan((point2.Y - point1.Y) / (point2.X - point1.X)))) | |||
if point1.X < point2.X then | |||
if point1.Y < point2.Y then | |||
ang = ang + 0.0 | |||
else | |||
ang = 360.0 - ang | |||
end -- if end | |||
else | |||
if point1.Y < point2.Y then | |||
ang = 180.0 - ang | |||
else | |||
ang = ang + 180.0 | |||
end -- if end | |||
end -- if end | |||
if ang >=360 then | |||
ang = ang -360.0 | |||
end -- if end | |||
return ang | |||
end -- function end | |||
return math.abs(GetPolarDirection(Corner, Start) - GetPolarDirection(Corner, End)) | |||
end -- function end | |||
-- ---------------------------------------------------]] | |||
-- ======================== | -- Call = DrawEllipse(2DPoint(20.0, 20.0), 20.0, 10.0, 0.0, "Jim") | ||
local job = VectricJob() | |||
local EndRadius = 0.0 | |||
local TopRadius = 0.0 | |||
local ptT = Polar2D(DrawEllipse_CenterPt, (90.0 + DrawEllipse_LongAxeAngle), H(DrawEllipse_ShortAxe)) | |||
-- | local ptB = Polar2D(DrawEllipse_CenterPt, (270.0 + DrawEllipse_LongAxeAngle), H(DrawEllipse_ShortAxe)) | ||
local ptR = Polar2D(DrawEllipse_CenterPt, (0.0 + DrawEllipse_LongAxeAngle), H(DrawEllipse_LongAxe)) | |||
local ptL = Polar2D(DrawEllipse_CenterPt, (180.0 + DrawEllipse_LongAxeAngle), H(DrawEllipse_LongAxe)) | |||
local ptC = DrawEllipse_CenterPt | |||
--[[ | |||
DMark("ptC", ptC) | |||
DMark("ptT", ptT) | |||
DMark("ptB", ptB) | |||
DMark("ptL", ptL) | |||
DMark("ptR", ptR)]] | |||
local C_Offset = H(DrawEllipse_LongAxe - DrawEllipse_ShortAxe) | |||
local LT_SlopeDist = H(GetDistance(ptL, ptT) - H(DrawEllipse_LongAxe - DrawEllipse_ShortAxe)) | |||
local LT_Dist = GetDistance(ptL, ptT) | |||
local LT_Angle = math.abs(90.0 - GetAngle(ptT, ptL, ptC)) | |||
local pt_a = Polar2D(ptL, LT_Angle + DrawEllipse_LongAxeAngle, LT_SlopeDist) | |||
local aT_Dist = GetDistance(pt_a, ptT) | |||
- | local aC_Dist = aT_Dist / (math.tan(math.rad(LT_Angle))) | ||
local Tc_Dist = math.sqrt(aT_Dist^2 + aC_Dist^2) | |||
local pt_c = Polar2D(ptT, (270.0 + DrawEllipse_LongAxeAngle), Tc_Dist) | |||
local cC_Dist = GetDistance(pt_c, ptC) | |||
local b_Dist = math.tan(math.rad(LT_Angle)) * cC_Dist | |||
local pt_b = Polar2D(ptC, (180.0 + DrawEllipse_LongAxeAngle), b_Dist) | |||
local pt_d = Polar2D(ptB, (90.0 + DrawEllipse_LongAxeAngle), Tc_Dist) | |||
local pt_e = Polar2D(ptC, (0.0 + DrawEllipse_LongAxeAngle), b_Dist) | |||
local pt1 = Polar2D(pt_d, (270.0 + DrawEllipse_LongAxeAngle) - LT_Angle, Tc_Dist) | |||
local pt2 = Polar2D(pt_d, (270.0 + DrawEllipse_LongAxeAngle) + LT_Angle, Tc_Dist) | |||
local pt3 = Polar2D(pt_c, (90.0 + DrawEllipse_LongAxeAngle) - LT_Angle, Tc_Dist) | |||
local pt4 = Polar2D(pt_c, (90.0 + DrawEllipse_LongAxeAngle) + LT_Angle, Tc_Dist) | |||
--[[ | |||
DMark("pt1", pt1) | |||
DMark("pt2", pt2) | |||
DMark("pt3", pt3) | |||
DMark("pt4", pt4) | |||
local line = Contour(0.0) | |||
local layer = job.LayerManager:GetLayerWithName(DrawEllipse_Layer) | |||
line:AppendPoint(pt1) | |||
line:LineTo(pt2) | |||
line:LineTo(pt3) | |||
line:LineTo(pt4) | |||
line:LineTo(pt1) | |||
layer:AddObject(CreateCadContour(line), true)]] | |||
local T_Sec = GetDistance(ptC, ptT) - H(GetDistance(pt1, pt4)) | |||
local R_Sec = GetDistance(ptC, ptR) - H(GetDistance(pt1, pt2)) | |||
local T_Chor = GetDistance(pt1, pt2) | |||
local R_Chor = GetDistance(pt1, pt4) | |||
local T_Bulge = Radius2Bulge (pt1, pt2, Tc_Dist) | |||
local L_Bulge = Radius2Bulge (pt1, pt4, GetDistance(ptL, pt_b)) | |||
local line = Contour(0.0) | |||
local layer = job.LayerManager:GetLayerWithName(DrawEllipse_Layer) | |||
line:AppendPoint(pt1) | |||
line:ArcTo(pt2, T_Bulge) | |||
line:ArcTo(pt3, L_Bulge) | |||
line:ArcTo(pt4, T_Bulge) | |||
line:ArcTo(pt1, L_Bulge) | |||
layer:AddObject(CreateCadContour(line), true) | |||
job:Refresh2DView() | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
===DrawBox=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Draws a Box from points provided. | |||
<nowiki>function DrawBox(p1, p2, p3, p4, Layer) | |||
--[[ Draw Box | |||
function main(script_path) | |||
local MyPt1 = Point2D(1.0,1.0) | |||
local MyPt2 = Point2D(1.0,3.0) | |||
local MyPt3 = Point2D(3.0,1.0) | |||
local MyPt4 = Point2D(3.0,3.0) | |||
local layer = "My Box" | |||
DrawBox(MyPt1 ,MyPt2, MyPt3, MyPt4, Layer) | |||
return true | |||
end -- function end | |||
-- -----------------------------------------------------]] | |||
local job = VectricJob() | |||
if not job.Exists then | |||
DisplayMessageBox("Error: No job loaded") | |||
return false | |||
end -- if end | |||
local line = Contour(0.0) | |||
local layer = job.LayerManager:GetLayerWithName(Layer) | |||
line:AppendPoint(p1) | |||
line:LineTo(p2) | |||
line:LineTo(p3) | |||
line:LineTo(p4) | |||
line:LineTo(p1) | |||
layer:AddObject(CreateCadContour(line), true) | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
===DrawCircle=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Draws a circle. | |||
<nowiki>function DrawCircle(Pt1, CenterRadius, Layer) | |||
--[[ ==Draw Circle== | |||
function main(script_path) | |||
local MyPt1 = Point2D(1.0,1.0) | |||
local MyRad = 3.0 | |||
local layer = "My Box" | |||
DrawCircle(MyPt1, MyRad, Layer) | |||
return true | |||
end -- function end | |||
-- -----------------------------------------------------]] | |||
local job = VectricJob() | |||
if not job.Exists then | |||
DisplayMessageBox("Error: No job loaded") | |||
return false | |||
end -- if end | |||
local pa = Polar2D(Pt1, 180.0, CenterRadius) | |||
local pb = Polar2D(Pt1, 0.0, CenterRadius) | |||
local Contour = Contour(0.0) | |||
local layer = job.LayerManager:GetLayerWithName(Layer) | |||
Contour:AppendPoint(pa) | |||
Contour:ArcTo(pb, 1) | |||
Contour:ArcTo(pa, 1) | |||
layer:AddObject(CreateCadContour(Contour), true) | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
===DrawLine=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Draws a Line from points provided. | |||
<nowiki>function DrawLine(Pt1, Pt2, Layer) | |||
--[[Draws a line from Pt1 to Pt2 on the layer name. | |||
function main(script_path) | |||
local MyPt1 = Point2D(3.5,3.8) | |||
local MyPt2 = Point2D(3.5,6.8) | |||
local layer = "My Line" | |||
DrawLine(MyPt1 , MyPt2, MyPt3, Layer) | |||
return true | |||
end -- function end | |||
-- -----------------------------------------------------]] | |||
local job = VectricJob() | |||
if not job.Exists then | |||
DisplayMessageBox("Error: No job loaded") | |||
return false | |||
end | |||
local line = Contour(0.0) | |||
local layer = job.LayerManager:GetLayerWithName(Layer) | |||
line:AppendPoint(Pt1) | |||
line:LineTo(Pt2) | |||
layer:AddObject(CreateCadContour(line), true) | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
===DrawStar=== | |||
[[File:TopOfPage.png|right|30px|link | |||
else | else | ||
file:write("1,04.5000,23.2500\n"); file:write("1,06.0000,03.3125\n"); file:write("1,06.5000,15.5000\n"); file:write("1,05.3750,19.5000\n"); | |||
file:write("1,07.1875,17.5000\n"); file:write("1,06.1875,23.5000\n"); file:write("2,07.8750,03.8750\n"); file:write("3,09.8750,05.0000\n"); | |||
file:write("1,11.7500,05.8750\n"); file:write("2,13.7500,06.6750\n"); file:write("3,15.7500,07.8750\n"); file:write("1,17.1250,08.8250\n"); | |||
file:write("2,19.5000,09.5000\n"); file:write("3,21.1250,10.3750\n"); file:write("1,23.6250,11.1250\n"); file:write("2,25.5000,12.1250\n"); | |||
file:write("3,27.6250,13.7500\n"); file:write("1,29.5000,14.7500\n"); file:write("2,31.4375,15.7500\n"); file:write("3,33.4375,16.7500\n"); | |||
file:write("1,35.4375,17.7500\n"); file:write("2,37.4375,18.6250\n"); file:write("3,39.3750,19.6250\n"); file:write("1,41.3750,20.6250\n"); | |||
file:write("2,43.3750,21.6250\n"); file:write("3,45.1875,22.6250\n"); file:write("1,47.2500,23.6250\n"); file:write("2,49.1875,24.6250\n"); | |||
file:write("3,51.1250,25.5000\n"); file:write("1,53.1250,26.5000\n"); file:write("2,55.1250,27.5000\n"); file:write("3,57.1250,28.5000\n"); | |||
file:write("1,59.1250,29.5000\n"); file:write("2,61.2500,30.5000\n"); file:write("3,62.9375,31.4375\n"); file:write("1,64.9375,32.4375\n"); | |||
file:write("2,66.9375,33.4375\n"); file:write("3,68.8125,34.4375\n"); file:write("1,70.8750,35.3750\n"); file:write("2,72.9375,36.4375\n"); | |||
file:write("3,74.8750,37.4375\n"); file:write("1,76.9375,38.3750\n"); file:write("2,78.7500,39.3750\n"); file:write("3,80.7500,40.3750\n"); | |||
file:write("1,82.6250,41.3750\n"); file:write("2,84.6250,42.3750\n"); file:write("3,86.6250,43.3750\n"); file:write("1,88.5000,44.2500\n"); | |||
file:write("2,90.6250,45.2500\n"); file:write("3,92.6250,46.2500\n"); file:write("1,94.4375,47.2500\n"); file:write("2,95.4375,48.2500\n") | |||
end -- if end | end -- if end | ||
file:close() -- closes the open file | |||
end -- if end | end -- if end | ||
return true | |||
end -- function end </nowiki> | |||
return | ---- | ||
end -- function end | |||
==Text File Tools== | |||
[[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | |||
This object is a name-value pair that represents a Document Variable within a [[VectricJob]]. | |||
===LengthOfFile=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
Returns file line count | |||
<nowiki> function LengthOfFile(filename) | |||
Returns: number]] | |||
local len = 0 | |||
if FileExists(filename) then | |||
local file = io.open(filename) | |||
if file then | |||
for _ in file:lines() do | |||
len = len + 1 | |||
end | |||
file:close() | |||
end -- if end | end -- if end | ||
end | |||
return len | |||
end -- function end </nowiki> | |||
---- | |||
===NameValidater - Checks File Name for Valid Chars=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
Returns file line count | |||
<nowiki> function NameValidater(FileName) | |||
local MyTrue = true | |||
local strlen = string.len(FileName) | |||
local strup = string.upper(FileName) | |||
local i = 1 | |||
local y = "" | |||
while i <= strlen do | |||
y = string.byte(string.sub(strup, i, i)) | |||
if y == 32 then -- Space | |||
MyTrue = false | |||
-- ============================== | break | ||
elseif y == 45 then -- Dash | |||
MyTrue = false | |||
-- | break | ||
elseif y == 127 then -- Delete | |||
MyTrue = false | |||
break | |||
elseif y == 126 then -- Delete | |||
MyTrue = false | |||
break | |||
elseif y == 123 then -- Open brace | |||
MyTrue = false | |||
-- | break | ||
-- | elseif y == 124 then -- Pipe | ||
-- | MyTrue = false | ||
break | |||
-- | elseif y == 125 then -- Close brace | ||
MyTrue = false | |||
break | |||
-- | |||
-- | elseif -- Illegal Filename Characters | ||
-- =========================== | (y == 33) or -- ! Exclamation mark | ||
(y == 34) or -- " Double Quotes | |||
-- | (y == 35) or -- # Hash | ||
-- ================== | (y == 36) or -- $ Dollar | ||
(y == 37) or -- % Percent | |||
(y == 38) or -- & Ampersand | |||
(y == 39) or -- ' Apostrophe | |||
(y == 42) or -- * Asterisk | |||
(y == 43) or -- + Plus | |||
(y == 44) or -- , Comma | |||
(y == 47) or -- / Slash | |||
(y == 58) or -- : Colon | |||
(y == 59) or -- ; Semi-colon | |||
(y == 60) or -- < Less than | |||
(y == 62) or -- > Greater than | |||
(y == 63) or -- ? Question mark | |||
(y == 64) or -- @ At | |||
(y == 92) or -- \ Backslash | |||
(y == 96) or -- ` Single Quotes | |||
(y == 123) or -- { Open brace | |||
(y == 124) or -- | Pipe | |||
(y == 125) -- } Close brace | |||
then | |||
MyTrue = false | |||
break | |||
elseif (y <= 31) then -- Control Codes | |||
MyTrue = false | |||
break | |||
elseif (y >= 48) and (y <= 57) then -- Numbers | |||
MyTrue = false | |||
break | |||
elseif (y >= 65) and (y <= 90) then -- Uppercase A to Z | |||
MyTrue = false | |||
break | |||
elseif (y >= 97) and (y <= 122) then -- Lowercase A to Z | |||
MyTrue = false | |||
break | |||
elseif (y >= 65) and (y <= 90) then -- Uppercase A to Z | |||
MyTrue = false | |||
break | |||
end -- if end | |||
i = i + 1 end -- while end; | |||
return MyTrue | |||
end -- function end </nowiki> | |||
---- | |||
===CopyFileFromTo=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
Copy Old File to Newfile | |||
<nowiki> function CopyFileFromTo(OldFile, NewFile) | |||
if FileExists(NewFile) then | |||
DisplayMessageBox("File copy " .. File .. " failed. \n\nFile found at: " .. NewFile .. "\n" ) | |||
return false | |||
elseif not FileExists(OldFile) then | |||
DisplayMessageBox("File copy of " .. File .. " failed. \n\nFile not found at: " .. OldFile .. "\n" ) | |||
return false | |||
else | |||
local fileR = io.open(OldFile) -- reader file | |||
local fileW = io.open(NewFile, "w") -- writer file | |||
if fileR and fileW then -- if both files are open | |||
for Line in fileR:lines() do | |||
fileW:write(Line .. "\n") | |||
end -- for end | |||
end | |||
if fileR then fileR:close() end | |||
if fileW then fileW:close() end | |||
return true | |||
end -- for end | |||
end -- function end </nowiki> | |||
---- | |||
===ValidateName=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
Returns True if the file name is safe to use | |||
<nowiki> function ValidateName(FileName) | |||
local MyTrue = true | |||
local strlen = string.len(FileName) | |||
local strup = string.upper(FileName) | |||
local i = 1 | |||
local y = "" | |||
while i <= strlen do | |||
y = string.byte(string.sub(strup, i, i)) | |||
if y == 32 then -- Space | |||
MyTrue = true | |||
elseif y == 45 then -- hyphn | |||
MyTrue = true | |||
elseif (y >= 48) and (y <= 57) then -- numbers | |||
MyTrue = true | |||
elseif (y >= 65) and (y <= 90) then -- Uppercase | |||
MyTrue = true | |||
else | |||
MyTrue = false | |||
break | |||
end -- if end | |||
i = i + 1 | |||
end -- while end | |||
return MyTrue | |||
end -- function end </nowiki> | |||
---- | |||
===FileExists=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
Returns True if file is found | |||
<nowiki> function FileExists(name) | |||
-- call = ans = FileExists("sample.txt") | |||
local f=io.open(name,"r") | |||
if f~=nil then io.close(f) return true else io.close(f) return false end | |||
end -- function end </nowiki> | |||
---- | |||
===FileAccess=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
Returns true if file is available for update. | |||
<nowiki> function FileAccess(FileName) | |||
if (not(os.rename(FileName, FileName))) then | |||
StatusMessage("Error", FileName, "The Gadget cannot access the ".. FileName .. | |||
" The OS has blocked write access. " .. | |||
"Verify the full path is correct and No application has the file open. ", "(1405)") | |||
return false | |||
else | |||
return true | |||
end -- if end | |||
end -- function end </nowiki> | |||
---- | |||
===IsDir=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
Returns true if path is found | |||
<nowiki> function IsDir(path) -- | |||
local function exists(file) | |||
local ok, err, code = os.rename(file, file) | |||
if not ok then | |||
if code == 13 then | |||
return true | |||
end | |||
end | |||
return ok, err | |||
end | |||
return exists(path.."/") | |||
end -- function end </nowiki> | |||
---- | |||
===Sheetlabel=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
Returns file line count of a txt (assic) file | |||
<nowiki> function Sheetlabel(Wpt, xTextHeight, xThickness, xType, YY) -- Constructs sheet label | |||
local pt1Text = Point2D() | |||
local Pang = 0.0 | |||
local Tang = 0.0 | |||
if YY then | |||
pt1Text = Polar2D(Polar2D(Wpt, 90.0, YY), 90.0, 6.0 * JimAndi.Cal) | |||
Pang = 270.0 | |||
Tang = 0.0 | |||
else | |||
if Material.Orientation == "V" then | |||
pt1Text = Polar2D(Wpt, 90.0, Milling.MaterialBlockWidth + (4.0 * JimAndi.Cal)) | |||
else | |||
pt1Text = Polar2D(Wpt, 90.0, Milling.MaterialBlockHeight + (4.0 * JimAndi.Cal)) | |||
end | |||
Pang = 270.0 | |||
Tang = 0.0 | |||
end | |||
DrawWriter(Project.ProgramName, pt1Text, Milling.TextHeight * 3.0, JimAndi.LNDrawNotes, Tang) | |||
pt1Text = Polar2D(pt1Text, Pang, Milling.TextHeight * 3.35) | |||
DrawWriter("Cabinet ID: " .. Project.DrawerID, pt1Text, JimAndi.TextHeight * 2.0, JimAndi.LNDrawNotes, Tang) | |||
pt1Text = Polar2D(pt1Text, Pang, Milling.TextHeight * 2.75) | |||
DrawWriter("Cabinet Name: " .. Project.CabinetName, pt1Text, JimAndi.TextHeight * 2.0, JimAndi.LNDrawNotes, Tang) | |||
pt1Text = Polar2D(pt1Text, Pang, Milling.TextHeight * 2.75) | |||
if xThickness then | |||
DrawWriter("Material: " .. xThickness .. " " .. xType, pt1Text, JimAndi.TextHeight * 2.0, JimAndi.LNDrawNotes, Tang) | |||
end -- if end | |||
end -- function end </nowiki> | |||
---- | |||
===DiskRights=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
Returns true if you have write access to path. | |||
<nowiki> function DiskRights(path) -- | |||
local xx = io.open(path, "w") | |||
if xx == nil then | |||
io.close() | |||
return false | |||
else | |||
xx:close() | |||
return true | |||
end | |||
end -- function end </nowiki> | |||
---- | |||
==Geometry Tools== | |||
[[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | |||
This object is a name-value pair that represents a Document Variable within a [[VectricJob]]. | |||
===SheetNew=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
Adds a new sheet to the drawing | |||
<nowiki> function SheetNew() -- Adds a new sheet to the drawing | |||
if GetVersion() >= 10.5 then then | |||
local layer_manager = Milling.job.LayerManager | |||
-- get current sheet count - note sheet 0 the default sheet counts as one sheet | |||
local orig_num_sheets = layer_manager.NumberOfSheets | |||
-- get current active sheet index | |||
local orig_active_sheet_index = layer_manager.ActiveSheetIndex | |||
-- set active sheet to last sheet | |||
local num_sheets = layer_manager.NumberOfSheets | |||
layer_manager.ActiveSheetIndex = num_sheets - 1 | |||
-- Add a new sheet | |||
layer_manager:AddNewSheet() | |||
-- set active sheet to last sheet we just added | |||
num_sheets = layer_manager.NumberOfSheets | |||
layer_manager.ActiveSheetIndex = num_sheets - 1 | |||
Milling.job:Refresh2DView() | |||
end -- if end | |||
return true | |||
end </nowiki> | |||
---- | |||
===GetDiameterAndCentre=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function GetDiameterAndCentre(cadcontour, point2d) | |||
local contour = cadcontour:GetContour() | |||
local arc = contour:GetFirstSpan() | |||
local point3d = Point3D(); | |||
arc = CastSpanToArcSpan(arc) | |||
local diameter = arc:RadiusAndCentre(point3d) * 2.0 | |||
point2d = Point2D(point3d.x, point3d.y) | |||
-- MessageBox("Diameter = " .. diameter) | |||
return diameter, point2d | |||
end</nowiki> | |||
---- | |||
===IsCircle=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function IsCircle(cadcontour) -- Returns True if conture is a circle | |||
local contour = cadcontour:GetContour() | |||
-- Does it consist only of arcs? | |||
if contour.ContainsBeziers then | |||
return false | |||
end | |||
if not contour.ContainsArcs then | |||
return false | |||
end | |||
-- Does is contain 4 contours? | |||
if contour.Count ~= 4 then | |||
return false | |||
end | |||
-- Check the arcs end and initial points make a square. | |||
local arcs = {} | |||
local count = 1; | |||
local pos = contour:GetHeadPosition() | |||
local object | |||
while pos ~= nil do | |||
object, pos = contour:GetNext(pos) | |||
arcs[count] = object | |||
count = count + 1 | |||
end | |||
local x_1 =(arcs[1]).StartPoint2D.x | |||
local y_1 =(arcs[1]).StartPoint2D.y | |||
local x_3 =(arcs[3]).StartPoint2D.x | |||
local y_3 =(arcs[3]).StartPoint2D.y | |||
local x_2 =(arcs[2]).StartPoint2D.x | |||
local y_2 =(arcs[2]).StartPoint2D.y | |||
local x_4 =(arcs[4]).StartPoint2D.x | |||
local y_4 =(arcs[4]).StartPoint2D.y | |||
local horizontal_distance = (x_1 - x_3)*(x_1 - x_3) + (y_1 - y_3)*(y_1 - y_3) | |||
local vertical_distance = (x_4 - x_2)*(x_4 - x_2) + (y_2 - y_4)*(y_2 - y_4) | |||
if math.abs(horizontal_distance - vertical_distance) > 0.04 then | |||
return false | |||
end | |||
-- Check the bulge factor is 90 | |||
local bulge = 0; | |||
for _, arc_span in ipairs(arcs) do | |||
bulge = CastSpanToArcSpan(arc_span).Bulge; | |||
if math.abs(math.abs(bulge) - g_bulge90) > 0.04 then | |||
return false | |||
end | |||
end | |||
return true | |||
end</nowiki> | |||
---- | |||
===SheetSet=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function SheetSet(Name) -- Move focus to a named sheet | |||
local job = VectricJob() | |||
local sheet_manager = job.SheetManager | |||
local sheet_ids = sheet_manager:GetSheetIds() | |||
for id in sheet_ids do | |||
if(sheet_manager:GetSheetName(id) == Name) then | |||
sheet_manager.ActiveSheetId = id | |||
end | |||
end | |||
end</nowiki> | |||
---- | |||
===SheetNextSize=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function SheetNextSize(X, Y) -- Make New Sheet to size (x, y) | |||
if X == nil then | |||
X = Milling.MaterialBlockWidth | |||
else | |||
X = X + (2 * Milling.Cal) | |||
end | |||
if Y == nil then | |||
Y = Milling.MaterialBlockHeight | |||
else | |||
Y = Y + (2 * Milling.Cal) | |||
end | |||
Milling.Sheet = Milling.Sheet + 1 | |||
local sheet_manager = Milling.job.SheetManager | |||
local sheet_ids = sheet_manager:GetSheetIds() | |||
for id in sheet_ids do | |||
if(sheet_manager:GetSheetName(id) == "Sheet 1") then | |||
sheet_manager:CreateSheets(1, id, Box2D(Point2D(0, 0), Point2D(X, Y))) | |||
end | |||
end | |||
SheetSet("Sheet " .. tostring(Milling.Sheet)) | |||
return true | |||
end</nowiki> | |||
---- | |||
===GetPolarAngle=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function GetPolarAngle(Start, Corner, End) -- Returns the Polar Angle | |||
local function GetPolarDirection(point1, point2) | |||
local ang = math.abs(math.deg(math.atan((point2.Y - point1.Y) / (point2.X - point1.X)))) | |||
if point1.X < point2.X then | |||
if point1.Y < point2.Y then | |||
ang = ang + 0.0 | |||
else | |||
ang = 360.0 - ang | |||
end -- if end | end -- if end | ||
else | |||
if | if point1.Y < point2.Y then | ||
ang = 180.0 - ang | |||
else | else | ||
ang = ang + 180.0 | |||
end -- if end | |||
end -- if end | |||
if ang >=360 then | |||
ang = ang -360.0 | |||
end -- if end | |||
return ang | |||
end -- function end | |||
return math.abs(GetPolarDirection(Corner, Start) - GetPolarDirection(Corner, End)) | |||
end -- function end</nowiki> | |||
---- | |||
== | ===GetOrientation=== | ||
[[File: | [[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | ||
<nowiki>function GetOrientation(point1, point2) -- Orientation of left, right, up or down | |||
if DecimalPlaces(point1.X,8) == DecimalPlaces(point2.X,8) then | |||
if point1.Y < point2.Y then | |||
return 90.0 | |||
else | |||
return 270.0 | |||
end | |||
elseif DecimalPlaces(point1.Y,8) == DecimalPlaces(point2.Y,8) then | |||
if point1.X < point2.X then | |||
return 0.0 | |||
else | |||
return 180.0 | |||
end | |||
else | |||
return nil | |||
end | |||
end -- function end</nowiki> | |||
---- | |||
=== | ===GetPolarDirection=== | ||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function GetPolarDirection(point1, point2) -- Retuens and amgle from two points | |||
local ang = math.abs(math.deg(math.atan((point2.Y - point1.Y) / (point2.X - point1.X)))) | |||
if point1.X < point2.X then | |||
if point1.Y < point2.Y then | |||
ang = ang + 0.0 | |||
else | |||
ang = 360.0 - ang | |||
end -- if end | |||
else | |||
if point1.Y < point2.Y then | |||
ang = 180.0 - ang | |||
else | |||
ang = ang + 180.0 | |||
end -- if end | |||
end -- if end | |||
if ang >=360 then | |||
ang = ang -360.0 | |||
end -- if end | |||
return ang | |||
end -- function end</nowiki> | |||
---- | |||
===CenterArc=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function CenterArc(A, B, RadiusD) -- Returns 2DPoint from Arc point and Radius | |||
local radius = ((tonumber(RadiusD) or 0) * g_var.scl) | |||
local horda = (A - B).Length | |||
if math.abs(radius) < (horda / 2) and radius ~= 0 then | |||
--D("Too small radius " .. radius .. "\nreplaced by the smallest possible " .. (horda / 2)) | |||
radius = (horda / 2) | |||
end | |||
return Point2D(((A.x + B.x) / 2 + (B.y - A.y) * math.sqrt(math.abs(radius) ^ 2 - (horda / 2) ^ 2) / horda), ((A.y + B.y) / 2 + (A.x - B.x) * math.sqrt(math.abs(radius) ^ 2 - (horda / 2) ^ 2) / horda)) | |||
end -- function end</nowiki> | |||
---- | |||
===Polar2D=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
The Polar2D function will calculate a new point in space based on a Point of reference, Angle of direction, and Projected distance. Returns 2DPoint from Known Point, Angle direction, and Projected distance. | |||
<nowiki>function Polar2D(pt, ang, dis) | |||
-- The Polar2D function will calculate a new point in space based on a Point of reference, Angle of direction, and Projected distance. | |||
-- ::''Returns a 2Dpoint(x, y)'' | |||
return Point2D((pt.X + dis * math.cos(math.rad(ang))), (pt.Y + dis * math.sin(math.rad(ang)))) | |||
end -- End Function</nowiki> | |||
---- | |||
-- | ===GetDistance=== | ||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
Returns Double from two Points | |||
<nowiki>function GetDistance(objA, objB) -- Returns Double from two Points | |||
local xDist = objB.x - objA.x | |||
local yDist = objB.y - objA.y | |||
return math.sqrt((xDist ^ 2) + (yDist ^ 2)) | |||
end -- function end</nowiki> | |||
---- | |||
-- =====================================================]] | ===GetAngle=== | ||
function | [[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | ||
<nowiki> | |||
- | -- ===========================================================]] | ||
</nowiki>function GetAngle(point1, point2) | |||
local ang = math.abs(math.deg(math.atan((point2.Y - point1.Y) / (point2.X - point1.X)))) | |||
if point1.X < point2.X then | |||
if point1.Y < point2.Y then | |||
ang = ang + 0.0 | |||
if | else | ||
ang = 360.0 - ang | |||
end -- if end | |||
else | |||
-- | if point1.Y < point2.Y then | ||
if | ang = 180.0 - ang | ||
else | |||
ang = ang + 180.0 | |||
end -- if end | |||
end -- if end | |||
if ang >=360.0 then | |||
ang = ang -360.0 | |||
end -- if end | |||
return ang | |||
end -- function end</nowiki> | |||
---- | |||
===Arc2Bulge=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki> | |||
-- ===========================================================]] | |||
</nowiki>function Arc2Bulge(p1, p2, Rad) -- Returns the Bulge factor for an arc | |||
local chord = math.sqrt(((p2.x - p1.x) ^ 2) + ((p2.y - p1.y) ^ 2)) | |||
local seg = (Rad - (0.5 * (math.sqrt((4.0 * Rad^2) - chord^2)))) | |||
local bulge = (2 * seg) / chord | |||
return bulge | |||
end -- function end</nowiki> | |||
---- | |||
===TrigIt=== | |||
Calculates Right Angle | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function TrigIt() -- Calculates Right Angle | |||
- | -- ==Trig Function== | ||
-- | -- VECTRIC LUA SCRIPT | ||
-- | -- =====================================================]] | ||
-- | -- Gadgets are an entirely optional add-in to Vectric's core software products. | ||
-- They are provided 'as-is', without any express or implied warranty, and you | |||
-- make use of them entirely at your own risk. | |||
-- In no event will the author(s) or Vectric Ltd. be held liable for any damages | |||
-- arising from their use. | |||
-- Permission is granted to anyone to use this software for any purpose, | |||
-- including commercial applications, and to alter it and redistribute it freely, | |||
-- subject to the following restrictions: | |||
-- 1. The origin of this software must not be misrepresented; you must not | |||
-- claim that you wrote the original software. | |||
-- 2. If you use this software in a product, an acknowledgement in the product | |||
-- documentation would be appreciated but is not required. | |||
-- 3. Altered source versions must be plainly marked as such, and must not be | |||
-- misrepresented as being the original software. | |||
-- 4. This notice may not be removed or altered from any source distribution. | |||
-- | |||
-- Right Triangle TrigFunction is written by Jim Anderson of Houston Texas 2020 | |||
-- =====================================================]] | |||
-- Code Debugger | |||
-- require("mobdebug").start() | |||
-- =====================================================]] | |||
-- Global Variables -- | |||
Trig = {} | |||
-- =====================================================]] | |||
function TrigTest() -- Test the All Right Angle | |||
TrigClear() | |||
Trig.A = 0.0 | |||
-- | Trig.B = 0.0 | ||
-- | Trig.C = 90.0 | ||
-- | Trig.Opp = 3.0 -- Rise or (B2C) | ||
Trig.Adj = 4.0 -- Base or (A2C) | |||
Trig.Hyp = 0.0 -- Slope or (A2B) | |||
Trig.Slope = 0.0 | |||
Trig.Area = 0.0 | |||
Trig.OutRadius = 0.0 | |||
Trig.InRadius = 0.0 | |||
Trig.Parameter = 0.0 | |||
TrigIt() | |||
DisplayMessageBox("Test 1: \n" .. | |||
" Trig.A = " .. tostring(Trig.A) .. " \n" .. | |||
" Trig.B = " .. tostring(Trig.B) .. " \n" .. | |||
" Trig.C = " .. tostring(Trig.C) .. " \n" .. | |||
" Trig.Opp = * " .. tostring(Trig.Opp) .. " \n" .. | |||
" Trig.Adj = * " .. tostring(Trig.Adj) .. " \n" .. | |||
" Trig.Hyp = " .. tostring(Trig.Hyp) .. " \n" .. | |||
" Trig.Slope = " .. tostring(Trig.Slope) .. " \n" .. | |||
" Trig.Area = " .. tostring(Trig.Area) .. " \n" .. | |||
" Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. | |||
" Trig.OutRadius = " .. tostring(Trig.OutRadius) .. " \n" .. | |||
" Trig.InRadius = " .. tostring(Trig.InRadius) .. " \n" | |||
) | |||
-- =====================================================]] | |||
TrigClear() | |||
Trig.A = 0.0 | |||
Trig.B = 0.0 | |||
Trig.C = 90.0 | |||
Trig.Opp = 0.0 -- Rise or (B2C) | |||
Trig.Adj = 4.0 -- Base or (A2C) | |||
Trig.Hyp = 5.0 -- Slope or (A2B) | |||
Trig.Slope = 0.0 | |||
Trig.Area = 0.0 | |||
Trig.OutRadius = 0.0 | |||
Trig.InRadius = 0.0 | |||
Trig.Parameter = 0.0 | |||
TrigIt() | |||
DisplayMessageBox("Test 2: \n" .. | |||
" Trig.A = " .. tostring(Trig.A) .. " \n" .. | |||
" Trig.B = " .. tostring(Trig.B) .. " \n" .. | |||
" Trig.C = " .. tostring(Trig.C) .. " \n" .. | |||
" Trig.Opp = * " .. tostring(Trig.Opp) .. " \n" .. | |||
" Trig.Adj = * " .. tostring(Trig.Adj) .. " \n" .. | |||
" Trig.Hyp = " .. tostring(Trig.Hyp) .. " \n" .. | |||
" Trig.Slope = " .. tostring(Trig.Slope) .. " \n" .. | |||
" Trig.Area = " .. tostring(Trig.Area) .. " \n" .. | |||
" Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. | |||
" Trig.OutRadius = " .. tostring(Trig.OutRadius) .. " \n" .. | |||
" Trig.InRadius = " .. tostring(Trig.InRadius) .. " \n" | |||
) | |||
-- =====================================================]] | |||
TrigClear() | |||
Trig.A = 0.0 | |||
Trig.B = 0.0 | |||
Trig.C = 90.0 | |||
Trig.Opp = 3.0 -- Rise or (B2C) | |||
Trig.Adj = 0.0 -- Base or (A2C) | |||
Trig.Hyp = 5.0 -- Slope or (A2B) | |||
Trig.Slope = 0.0 | |||
Trig.Area = 0.0 | |||
Trig.OutRadius = 0.0 | |||
Trig.InRadius = 0.0 | |||
Trig.Parameter = 0.0 | |||
TrigIt() | |||
DisplayMessageBox("Test 3: \n" .. | |||
" Trig.A = " .. tostring(Trig.A) .. " \n" .. | |||
" Trig.B = " .. tostring(Trig.B) .. " \n" .. | |||
" Trig.C = " .. tostring(Trig.C) .. " \n" .. | |||
" Trig.Opp = * " .. tostring(Trig.Opp) .. " \n" .. | |||
" Trig.Adj = " .. tostring(Trig.Adj) .. " \n" .. | |||
" Trig.Hyp = * " .. tostring(Trig.Hyp) .. " \n" .. | |||
" Trig.Slope = " .. tostring(Trig.Slope) .. " on 12 inch \n" .. | |||
" Trig.Area = " .. tostring(Trig.Area) .. " \n" .. | |||
" Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. | |||
" Trig.OutRadius = " .. tostring(Trig.OutRadius) .. " \n" .. | |||
" Trig.InRadius = " .. tostring(Trig.InRadius) .. " \n" | |||
) | |||
-- =====================================================]] | |||
TrigClear() | |||
Trig.A = 36.86897645844 | |||
Trig.B = 0.0 | |||
Trig.C = 90.0 | |||
Trig.Opp = 3.0 -- Rise or (B2C) | |||
Trig.Adj = 0.0 -- Base or (A2C) | |||
Trig.Hyp = 0.0 -- Slope or (A2B) | |||
Trig.Slope = 0.0 | |||
Trig.Area = 0.0 | |||
Trig.OutRadius = 0.0 | |||
Trig.InRadius = 0.0 | |||
Trig.Parameter = 0.0 | |||
TrigIt() | |||
DisplayMessageBox("Test 4: \n" .. | |||
" Trig.A = * " .. tostring(Trig.A) .. " \n" .. | |||
" Trig.B = " .. tostring(Trig.B) .. " \n" .. | |||
" Trig.C = " .. tostring(Trig.C) .. " \n" .. | |||
" Trig.Opp = * " .. tostring(Trig.Opp) .. " \n" .. | |||
" Trig.Adj = " .. tostring(Trig.Adj) .. " \n" .. | |||
" Trig.Hyp = " .. tostring(Trig.Hyp) .. " \n" .. | |||
" Trig.Slope = " .. tostring(Trig.Slope) .. " on 12 inch \n" .. | |||
" Trig.Area = " .. tostring(Trig.Area) .. " \n" .. | |||
" Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. | |||
" Trig.OutRadius = " .. tostring(Trig.OutRadius) .. " \n" .. | |||
" Trig.InRadius = " .. tostring(Trig.InRadius) .. " \n" | |||
) | |||
-- =====================================================]] | |||
TrigClear() | |||
Trig.A = 36.86897645844 | |||
Trig.B = 0.0 | |||
Trig.C = 90.0 | |||
Trig.Opp = 0.0 -- Rise or (B2C) | |||
Trig.Adj = 4.0 -- Base or (A2C) | |||
Trig.Hyp = 0.0 -- Slope or (A2B) | |||
-- | Trig.Slope = 0.0 | ||
Trig.Area = 0.0 | |||
Trig.OutRadius = 0.0 | |||
Trig.InRadius = 0.0 | |||
Trig.Parameter = 0.0 | |||
TrigIt() | |||
DisplayMessageBox("Test 5: \n" .. | |||
" Trig.A = * " .. tostring(Trig.A) .. " \n" .. | |||
" Trig.B = " .. tostring(Trig.B) .. " \n" .. | |||
" Trig.C = " .. tostring(Trig.C) .. " \n" .. | |||
" Trig.Opp = " .. tostring(Trig.Opp) .. " \n" .. | |||
" Trig.Adj = * " .. tostring(Trig.Adj) .. " \n" .. | |||
" Trig.Hyp = " .. tostring(Trig.Hyp) .. " \n" .. | |||
" Trig.Slope = " .. tostring(Trig.Slope) .. " on 12 inch \n" .. | |||
" Trig.Area = " .. tostring(Trig.Area) .. " \n" .. | |||
" Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. | |||
" Trig.OutRadius = " .. tostring(Trig.OutRadius) .. " \n" .. | |||
" Trig.InRadius = " .. tostring(Trig.InRadius) .. " \n" | |||
) | |||
-- =====================================================]] | |||
TrigClear() | |||
Trig.A = 36.86897645844 | |||
Trig.B = 0.0 | |||
Trig.C = 90.0 | |||
Trig.Opp = 0.0 -- Rise or (B2C) | |||
Trig.Adj = 0.0 -- Base or (A2C) | |||
Trig.Hyp = 5.0 -- Slope or (A2B) | |||
Trig.Slope = 0.0 | |||
Trig.Area = 0.0 | |||
Trig.OutRadius = 0.0 | |||
Trig.InRadius = 0.0 | |||
Trig.Parameter = 0.0 | |||
TrigIt() | |||
DisplayMessageBox("Test 6: \n" .. | |||
" Trig.A = * " .. tostring(Trig.A) .. " \n" .. | |||
" Trig.B = " .. tostring(Trig.B) .. " \n" .. | |||
" Trig.C = " .. tostring(Trig.C) .. " \n" .. | |||
" Trig.Opp = " .. tostring(Trig.Opp) .. " \n" .. | |||
-- | " Trig.Adj = " .. tostring(Trig.Adj) .. " \n" .. | ||
" Trig.Hyp = * " .. tostring(Trig.Hyp) .. " \n" .. | |||
" Trig.Slope = " .. tostring(Trig.Slope) .. " on 12 inch \n" .. | |||
" Trig.Area = " .. tostring(Trig.Area) .. " \n" .. | |||
" Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. | |||
" Trig.OutRadius = " .. tostring(Trig.OutRadius) .. " \n" .. | |||
" Trig.InRadius = " .. tostring(Trig.InRadius) .. " \n" | |||
) | |||
TrigClear() | |||
Trig.A = 0.0 | |||
Trig.B = 0.0 | |||
Trig.C = 90.0 | |||
Trig.Opp = 3.0 -- Rise or (B2C) | |||
Trig.Adj = 0.0 -- Base or (A2C) | |||
Trig.Hyp = 0.0 -- Slope or (A2B) | |||
Trig.Slope = 9.0 | |||
Trig.Area = 0.0 | |||
Trig.OutRadius = 0.0 | |||
Trig.InRadius = 0.0 | |||
Trig.Parameter = 0.0 | |||
TrigIt() | |||
DisplayMessageBox("Test 7: \n" .. | |||
" Trig.A = " .. tostring(Trig.A) .. " \n" .. | |||
" Trig.B = " .. tostring(Trig.B) .. " \n" .. | |||
" Trig.C = " .. tostring(Trig.C) .. " \n" .. | |||
" Trig.Opp = * " .. tostring(Trig.Opp) .. " \n" .. | |||
" Trig.Adj = " .. tostring(Trig.Adj) .. " \n" .. | |||
" Trig.Hyp = " .. tostring(Trig.Hyp) .. " \n" .. | |||
" Trig.Slope = * " .. tostring(Trig.Slope) .. " on 12 inch \n" .. | |||
" Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. | |||
" Trig.Area = " .. tostring(Trig.Area) .. " \n" .. | |||
" Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. | |||
" Trig.Circumscribing = " .. tostring(Trig.Circumscribing) .. " \n" .. | |||
" Trig.Inscribing = " .. tostring(Trig.Inscribing) .. " \n" | |||
) | |||
-- =====================================================]] | |||
TrigClear() | |||
Trig.A = 0.0 | |||
Trig.B = 0.0 | |||
Trig.C = 90.0 | |||
Trig.Opp = 0.0 -- Rise or (B2C) | |||
Trig.Adj = 0.0 -- Base or (A2C) | |||
Trig.Hyp = 0.0 -- Slope or (A2B) | |||
Trig.Slope = 9.0 | |||
Trig.Area = 0.0 | |||
Trig.OutRadius = 0.0 | |||
Trig.InRadius = 0.0 | |||
Trig.Parameter = 0.0 | |||
TrigIt() | |||
DisplayMessageBox("Test Error: \n" .. | |||
" Trig.A = " .. tostring(Trig.A) .. " \n" .. | |||
" Trig.B = " .. tostring(Trig.B) .. " \n" .. | |||
" Trig.C = " .. tostring(Trig.C) .. " \n" .. | |||
" Trig.Opp = * " .. tostring(Trig.Opp) .. " \n" .. | |||
" Trig.Adj = " .. tostring(Trig.Adj) .. " \n" .. | |||
" Trig.Hyp = " .. tostring(Trig.Hyp) .. " \n" .. | |||
" Trig.Slope = * " .. tostring(Trig.Slope) .. " on 12 inch \n" .. | |||
" Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. | |||
" Trig.Area = " .. tostring(Trig.Area) .. " \n" .. | |||
" Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. | |||
" Trig.Circumscribing = " .. tostring(Trig.Circumscribing) .. " \n" .. | |||
" Trig.Inscribing = " .. tostring(Trig.Inscribing) .. " \n" | |||
) | |||
return true | |||
end -- function end -- | |||
-- =====================================================]] | |||
function TrigClear() -- Clears and resets Trig Table | |||
Trig.A = 0.0 | |||
Trig.B = 0.0 | |||
Trig.C = 90.0 | |||
Trig.Opp = 0.0 -- Rise or (B2C) | |||
Trig.Adj = 0.0 -- Base or (A2C) | |||
Trig.Hyp = 0.0 -- Slope or (A2B) | |||
Trig.Slope = 0.0 | |||
-- | |||
return true | return true | ||
end -- function end | end -- function end | ||
-- =====================================================]] | |||
local function BSA() | |||
Trig.B = (Trig.C - Trig.A) | |||
Trig.Slope = math.tan(math.rad(Trig.A)) * 12.0 | |||
Trig.Area = (Trig.Opp * Trig.Adj) * 0.5 | |||
Trig.Inscribing = ((Trig.Opp + Trig.Adj) - Trig.Hyp) * 0.5 | |||
Trig.Circumscribing = Trig.Hyp * 0.5 | |||
Trig.Parameter = Trig.Opp + Trig.Adj + Trig.Hyp | |||
end | |||
if Trig.A == 0.0 and Trig.B > 0.0 and Trig.Slope == 0.0 then | |||
Trig.A = Trig.C - Trig.B | |||
elseif Trig.A == 0.0 and Trig.B == 0.0 and Trig.Slope > 0.0 then | |||
Trig.A = math.deg(math.atan(Trig.Slope / 12.0)) | |||
end -- if end | |||
-- test 4 | |||
if (Trig.A > 0.0) and (Trig.Opp > 0.0) then -- A and Rise or (B2C) | |||
Trig.Adj = Trig.Opp / (math.tan(math.rad(Trig.A))) | |||
Trig.Hyp = math.sqrt((Trig.Opp * Trig.Opp ) + ( Trig.Adj * Trig.Adj)) | |||
BSA() | |||
return true | |||
-- test 6 | |||
elseif (Trig.A > 0.0) and (Trig.Hyp > 0.0) then -- A and Slope or (A2B) | |||
Trig.Adj = math.cos(math.rad(Trig.A)) * Trig.Hyp | |||
Trig.Opp = math.sqrt((Trig.Hyp * Trig.Hyp ) - ( Trig.Adj * Trig.Adj)) | |||
BSA() | |||
return true | |||
-- test 5 | |||
elseif (Trig.A > 0.0) and (Trig.Adj > 0.0) then -- A and Base or (A2C) | |||
Trig.Opp = math.tan(math.rad(Trig.A)) * Trig.Adj | |||
Trig.Hyp = math.sqrt((Trig.Opp * Trig.Opp ) + ( Trig.Adj * Trig.Adj)) | |||
BSA() | |||
return true | |||
-- test 1 | |||
elseif (Trig.Opp > 0.0) and (Trig.Adj > 0.0) then -- Rise and Base | |||
Trig.Hyp = math.sqrt((Trig.Opp * Trig.Opp ) + ( Trig.Adj * Trig.Adj)) | |||
Trig.A = math.deg(math.atan(Trig.Opp / Trig.Adj)) | |||
BSA() | |||
return true | |||
elseif (Trig.Adj > 0.0) and (Trig.Hyp > 0.0) then -- Rise and Slope | |||
-- test 2 | |||
Trig.Opp = math.sqrt((Trig.Hyp * Trig.Hyp ) - ( Trig.Adj * Trig.Adj)) | |||
Trig.A = math.deg(math.atan(Trig.Opp / Trig.Adj)) | |||
BSA() | |||
return true | |||
elseif (Trig.Opp > 0.0) and (Trig.Hyp > 0.0) then -- Base and Slope | |||
-- test 3 | |||
Trig.Adj = math.sqrt((Trig.Hyp * Trig.Hyp ) - ( Trig.Opp * Trig.Opp)) | |||
Trig.A = math.deg(math.atan(Trig.Opp / Trig.Adj)) | |||
BSA() | |||
return true | |||
else | |||
DisplayMessageBox("Error: Trig Values did not match requirements: \n" .. | |||
" Trig.A = " .. tostring(Trig.A) .. " \n" .. | |||
" Trig.B = " .. tostring(Trig.B) .. " \n" .. | |||
" Trig.C = " .. tostring(Trig.C) .. " \n" .. | |||
" Trig.Opp = " .. tostring(Trig.Opp) .. " \n" .. | |||
" Trig.Adj = " .. tostring(Trig.Adj) .. " \n" .. | |||
" Trig.Hyp = " .. tostring(Trig.Hyp) .. " \n" .. | |||
" Trig.Slope = " .. tostring(Trig.Slope) .. " on 12 inch \n" .. | |||
" Trig.Area = " .. tostring(Trig.Area) .. " \n" .. | |||
" Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. | |||
" Trig.OutRadius = " .. tostring(Trig.OutRadius) .. " \n" .. | |||
" Trig.InRadius = " .. tostring(Trig.InRadius) .. " \n" | |||
) | |||
return false | |||
end | |||
end -- function end | |||
-- =====================================================]] | |||
end -- Geometry Tools end | |||
</nowiki> | |||
==INI File Tools== | |||
[[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | |||
These functions manipulate the INI files for the storage and retrieval of data. | |||
===INI_NameStrip=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Convert string to the correct data type. | |||
Local Words = NameStrip("KPSDFKSPSK - 34598923", "-") -- returns "KPSDFKSPSK" | |||
'''Source Code''' | |||
<nowiki> function INI_NameStrip(str, var) | |||
if "" == str then | |||
DisplayMessageBox("Error in string") | |||
else | |||
if string.find(str, var) then | |||
if | local j = assert(string.find(str, var) - 1) | ||
return All_Trim(string.sub(str, 1, j)) | |||
else | |||
return str | |||
local | |||
end | end | ||
end | end | ||
end -- function end </nowiki> | |||
end -- function end | ---- | ||
===INI_HeadStrip=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Convert string to the correct data type. | |||
<nowiki> | |||
function | function INI_HeadStrip(str, var) -- convert string to the correct data type | ||
-- Local Words = HeadStrip("LastName23 = Smith", "=") -- returns "Smith" | |||
if "" == str then | |||
DisplayMessageBox("Error in string") | |||
else | |||
if string.find(str, var) then | |||
local j = assert(string.find(str, var) + 1) | |||
return All_Trim(string.sub(str, j)) | |||
else | |||
return str | |||
end -- function end | end | ||
end | |||
end -- function end </nowiki> | |||
---- | |||
===INI_AreDupGroups=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Checks if there are duplicate groups. | |||
<nowiki>function INI_AreDupGroups(xPath, xFile) | |||
local GroupNames = {} | |||
local CleanNames = {} | |||
local DupGroups = {} | |||
GroupNames = INI_ReadGroups(xFile, aName) | |||
CleanNames = RemoveDups(GroupNames) | |||
if TableLength(GroupNames) == TableLength(CleanNames)then | |||
return true | |||
else | |||
return false | |||
end | end | ||
end -- function end </nowiki> | |||
---- | |||
===INI_FixDupGroups=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Find and fix duplicate groups | |||
<nowiki>function INI_FixDupGroups(xPath, xFile) | |||
end -- | local GroupNames = {} | ||
local CleanNames = {} | |||
</nowiki> | local DupGroups = {} | ||
GroupNames = INI_ReadGroups(xFile, aName) | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
== | ===INI_DeleteGroup=== | ||
[[File: | [[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | ||
Deletes only the first find of xGroup | |||
<nowiki>function INI_DeleteGroup(xPath, xFile, xGroup) | |||
-- Deletes old ini (.bak) file | |||
-- | -- Copy's the .ini to a backup (.bak) new file | ||
-- Reads the new backup file and writes a new file to the xGroup value | |||
-- Stops Writing lines until next Group is found | |||
-- Writes to end of file | |||
-- Call: DeleteGroup("C:\\Users\\James\\OneDrive\\Documents\\DoorGadget\\Clients\\Marcin", "ProjectList", "Boston") | |||
local OfileName = xPath .. "\\" .. xFile .. ".bak" | |||
if FileExists(OfileName) then | |||
os.remove(OfileName) | |||
end | |||
local | local NfileName = xPath .. "\\" .. xFile .. ".ini" | ||
-- os.rename(NfileName, OfileName) -- makes backup copy file | |||
if CopyFileFromTo(NfileName, OfileName) then | |||
local fileR = io.open(OfileName) | |||
local fileW = io.open(NfileName, "w") | |||
local groups = false | |||
local writit = true | |||
local MyTxt = "" | |||
local txt = "" | |||
if fileR and fileW then -- files are open | |||
for Line in fileR:lines() do -- read each line of the backup file | |||
end -- for end | txt = Line -- copy line from file to txt | ||
if All_Trim(Line) == "[" .. All_Trim(xGroup) .. MyTxt .. "]" then -- look for a match | |||
groups = true | |||
txt = "" | |||
end -- if end | |||
if groups and MyTxt == "" then -- if group is true turn off the write function | |||
writit = false | |||
if "[" == string.sub(All_Trim(txt), 1, 1) then -- turns write function on if next group is found | |||
groups = false | |||
xGroup = "-" | |||
writit = true | |||
MyTxt = "--" | |||
else | |||
writit = false | |||
end -- if end | |||
end -- if end | |||
if writit then | |||
fileW:write(txt .. "\n") | |||
txt = "" | |||
end -- if end | |||
end -- for end | |||
os.remove(OfileName) | |||
end -- if end | |||
if fileR then fileR:close() end | |||
if fileW then fileW:close() end | |||
end | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
===INI_RenameGroup=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Renames a group | |||
<nowiki>function INI_RenameGroup(xOldGroup, xNewGroup) | |||
--Deletes old ini Hardware.bak file | |||
--Copys the ini file to a backup copy file | |||
--Reads the backup file and writes a new ini file to the xGroup | |||
--Writes new file with new group to the new ini file | |||
local NfileName = Project.AppPath .. "\\" .. "EasyDrawerHardware" .. ".ini" | |||
local OfileName = Project.AppPath .. "\\" .. "EasyDrawerHardware" .. ".bak" | |||
os.remove(OfileName) | |||
CopyFileFromTo(NfileName, OfileName) -- makes backup file | |||
local fileR = io.open(OfileName) | |||
local fileW = io.open(NfileName, "w") | |||
if fileR and fileW then | |||
local groups = false | |||
local txt = "" | |||
for Line in fileR:lines() do | |||
if All_Trim(Line) == "[" .. All_Trim(xOldGroup) .. txt .. "]" then -- Group | |||
fileW:write(xNewGroup .. "\n") | |||
txt = "-" | |||
else | |||
fileW:write(Line .. "\n") | |||
end -- if end | |||
end -- for end | |||
fileR:close() | |||
end --if end | fileW:close() | ||
os.remove(OfileName) | |||
end -- if end | |||
return true | return true | ||
end -- function end | end -- function end</nowiki> | ||
-- | ---- | ||
===INI_DeleteItem=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Deleates a group | |||
== | <nowiki>function INI_DeleteItem(xPath, xFile, xGroup, xItem) | ||
[[File: | -- Deletes old ini (.bak) file | ||
-- Copys the .ini to a backup (.bak) new file | |||
-- Reads the new backup file and writes a new file to the xGroup value | |||
-- Stops Writing lines until next Group is found | |||
-- Writes to end of file | |||
-- DeleteGroup("C:\\Users\\James\\OneDrive\\Documents\\DoorGadget\\Clients\\Marcin", "ProjectList", "Boston") | |||
local NfileName = xPath .. "\\" .. xFile .. ".ini" | |||
local OfileName = xPath .. "\\" .. xFile .. ".bak" | |||
os.remove(OfileName) | |||
CopyFileFromTo(NfileName, OfileName) -- makes backup copy file | |||
local fileR = io.open(OfileName) | |||
local fileW = io.open(NfileName, "w") | |||
if fileR and fileW then | |||
local groups = false | |||
local writit = true | |||
local txt = "" | |||
for Line in fileR:lines() do | |||
txt = Line | |||
if All_Trim(Line) == "[" .. All_Trim(xGroup) .. "]" then | |||
groups = true | |||
end -- if end | |||
if groups then | |||
-- =================== | |||
if xItem == string.sub(Line, 1, string.len(xItem)) then -- Item | |||
writit = false | |||
groups = false | |||
end -- if end | |||
end -- if end | |||
-- =================== | |||
if writit then | |||
fileW:write(txt .. "\n") | |||
end -- if end | |||
writit = true | |||
end -- for end | |||
os.remove(OfileName) | |||
fileR:close() | |||
fileW:close() | |||
end -- if end | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
===INI_ValidateGroup=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Reads INI file and returns true if group is found | |||
<nowiki>function INI_ValidateGroup(xFile, xGroup) | |||
-- Reads INI file and returns true if the group is found | |||
local fileR = io.open(xFile) | |||
local group = false | |||
for Line in fileR:lines() do | |||
if string.upper(All_Trim(Line)) == "[" .. string.upper(All_Trim(xGroup)) .. "]" then -- Group | |||
function | group = true | ||
-- | break | ||
end -- if end | |||
end -- for end | |||
fileR:close() | |||
if | return group | ||
end -- function end</nowiki> | |||
---- | |||
===INI_ValidateItem=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Reads INI file and returns true if group and item is found | |||
end | <nowiki>function INI_ValidateItem(xFile, xGroup, xItem) | ||
end -- | local fileR = io.open(xFile) | ||
-- ======= | if fileR then | ||
function | local group = false | ||
local | local item = false | ||
if | local ItemLen = string.len(xItem) | ||
for Line in fileR:lines() do | |||
if All_Trim(Line) == "[" .. string.upper(All_Trim(xGroup)) .. "]" then -- Group | |||
group = true | |||
end -- if end | |||
if group then | |||
if string.upper(xItem) == string.upper(string.sub(Line, 1, string.len(xItem))) then -- Item | |||
item = true | |||
break | |||
end -- if end | |||
end -- if end | |||
end -- for end | |||
fileR:close() | |||
end -- if end | |||
return group | |||
end -- function end</nowiki> | |||
---- | |||
===INI_StrValue=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Reads INI file and returns string value | |||
<nowiki>function INI_StrValue(str, ty) | |||
-- Convert string to the correct data type | |||
if nil == str then | |||
DisplayMessageBox("Error in Ini file - looking for a " .. ty .. " value") | |||
else | |||
if "" == All_Trim(str) then | |||
DisplayMessageBox("Error in Ini file - looking for a " .. ty .. " value") | |||
else | |||
local j = (string.find(str, "=") + 1) | |||
if ty == "D" then -- Double | |||
return | return tonumber(string.sub(str, j)) | ||
end -- if end | |||
if ty == "I" then -- Intiger | |||
function | return math.floor(tonumber(string.sub(str, j))) | ||
end -- if end | |||
if ty == "S" then -- String | |||
return All_Trim(string.sub(str, j)) | |||
end -- if end | |||
if ty == "B" then -- Bool | |||
if "TRUE" == All_Trim(string.sub(str, j)) then | |||
else | return true | ||
else | |||
return false | |||
end -- if end | |||
end -- if end | |||
end -- if end | |||
end -- if end | end -- if end | ||
return nil | |||
end -- function end</nowiki> | |||
---- | |||
return | ===INI_GetValue=== | ||
end -- | [[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | ||
Reads INI file and returns value | |||
function | <nowiki>function INI_GetValue(xPath, FileName, GroupName, ItemName, ValueType) | ||
-- ==INI_GetValue(xPath, FileName, GroupName, ItemName, ValueType)== | |||
-- Returns a value from a file, group, and Item | |||
-- Usage: XX.YY = GetIniValue("C:/temp", "ScrewDia", "[Screws]", "Diameter", "D") | |||
local filenameR = xPath .. "\\" .. FileName .. ".ini" | |||
local FL = LengthOfFile(filenameR) | |||
local file = io.open(filenameR, "r") | |||
local dat = "." | |||
local ItemNameLen = string.len(ItemName) | |||
if | if file then | ||
while (FL >= 1) do | |||
dat = string.upper(All_Trim(file:read())) | |||
if dat == "[" .. string.upper(GroupName) .. "]" then | |||
break | |||
else | |||
FL = FL - 1 | |||
end -- if end | |||
end -- while end | |||
while (FL >= 1) do | |||
dat = string.upper(All_Trim(file:read())) | |||
if string.upper(ItemName) == string.sub(dat, 1, ItemNameLen) then | |||
break | |||
end | else | ||
return | FL = FL - 1 | ||
end -- end | if FL == 0 then | ||
dat = "Error - item not found" | |||
function | break | ||
end -- if end | |||
-- | end -- if end | ||
end -- while end | |||
file:close()-- closes the open file | |||
end -- if end | |||
local XX = StrIniValue(dat, ValueType) | |||
return XX | |||
end -- function end</nowiki> | |||
---- | |||
===INI_GetIDFor=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Reads INI file and returns ID for a value | |||
<nowiki>function INI_GetIDFor(xPath, FileName, GroupName, ItemValue) | |||
-- == INI_GetIDFor(xPath, FileName, GroupName, ItemValue) == | |||
-- Returns a ItemID from a file, group, and ItemValue | |||
-- Usage: XX.YY = INI_GetIDFor("C:/temp", "UserList", "[Users]", "Anderson") | |||
-- returns: "UserLastName22" | |||
local filenameR = xPath .. "\\" .. FileName .. ".ini" | |||
local FL = LengthOfFile(filenameR) | |||
local file = io.open(filenameR, "r") | |||
if file then | |||
local dat = "." | |||
local ItemValueLen = string.len(ItemValue) | |||
while (FL >= 1) do | |||
dat = string.upper(All_Trim(file:read())) | |||
if dat == "[" .. string.upper(GroupName) .. "]" then | |||
break | |||
else | |||
FL = FL - 1 | |||
end -- if end | |||
end -- while end | |||
while (FL >= 1) do | |||
dat = string.upper(All_Trim(file:read())) | |||
if string.upper(ItemValue) == HeadStrip(dat, "=") then | |||
break | |||
else | |||
FL = FL - 1 | |||
if FL == 0 then | |||
dat = "Error - item not found" | |||
break | |||
end -- if end | |||
end -- if end | |||
end -- while end | |||
file:close()-- closes the open file | |||
end -- if end | |||
local XX = NameStrip(dat, "=") | |||
return XX | |||
end -- function end</nowiki> | |||
---- | |||
===INI_ReadGroups=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Reads INI file group and returns true if found | |||
<nowiki>function INI_ReadGroups(xFile, aName) | |||
--[[Reads INI and returns a list contain the [Headers] as Array | |||
IniFile = {} Global variables | |||
xPath = script_path | |||
]] | |||
local filename = xFile | |||
local file = io.open(filename, "r") | |||
if file then | |||
local fLength = (LengthOfFile(filename) - 1) | |||
local dat = All_Trim(file:read()) | |||
while (fLength >= 1) do | |||
if "[" == string.sub(dat, 1, 1) then | |||
table.insert (aName, string.sub(dat, 2, -2)) | |||
end | |||
dat = file:read() | |||
if dat then | |||
dat = All_Trim(dat) | |||
else | |||
file:close()-- closes the open file | |||
return true | |||
end | |||
fLength = fLength - 1 | |||
end -- while | |||
end -- if | |||
if file then file:close() end | |||
return true | |||
end -- function end</nowiki> | |||
end | ---- | ||
===INI_ProjectHeaderReader=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Reads INI file group and returns the INI Header values of a ini file and uploads to "IniFile" Array | |||
<nowiki>function INI_ProjectHeaderReader(xPath) | |||
local filename = xPath .. "/CabinetProjects.ini" | |||
local file = io.open(filename, "r") | |||
if file then | |||
local Cabing = (LengthOfFile(filename) - 1) | |||
local dat = All_Trim(file:read()) | |||
while (Cabing >= 1) do | |||
if "[" == string.sub(dat, 1, 1) then | |||
table.insert (Projects, string.sub(dat, 2, -2)) | |||
end | |||
dat = file:read() | |||
if dat then | |||
dat = All_Trim(dat) | |||
else | |||
if | return true | ||
end | |||
Cabing = Cabing - 1 | |||
end | end | ||
file:close() | |||
end | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
===INI_AddNewProject=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Appends a New Project to CabinetProjectQuestion.ini | |||
<nowiki>function INI_AddNewProject(xPath, xGroup) | |||
local filename = xPath .. "/ProjectList.ini" | |||
local file = io.open(filename, "a") | |||
if file then | |||
file:write("[" .. All_Trim(xGroup) .. "] \n") | |||
file:write("load_date = " .. StartDate(true) .. " \n") | |||
file:write("#====================================== \n") | |||
file:close()-- closes the open file | |||
end | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
===INI_StdHeaderReader=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Gets the INI Header values of a ini file and uploads to "IniFile" Array | |||
<nowiki>function INI_StdHeaderReader(xPath, Fname) | |||
local filename = xPath .. "\\" .. Fname .. ".ini" | |||
local file = io.open(filename, "r") | |||
if file then | |||
local WallMilling = (LengthOfFile(filename) - 1) | |||
local dat = All_Trim(file:read()) | |||
while (WallMilling >= 0) do | |||
if "[" == string.sub(dat, 1, 1) then | |||
table.insert (IniFile, string.sub(dat, 2, -2)) | |||
end -- if end | |||
dat = file:read() | |||
if dat then | |||
dat = All_Trim(dat) | |||
else | |||
return true | |||
end -- if end | |||
WallMilling = WallMilling - 1 | |||
end -- while end | |||
file:close() | |||
end | end | ||
return true | return true | ||
end -- function end | end -- function end</nowiki> | ||
-- ======= | ---- | ||
function | |||
===INI_ReadProjectinfo=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Reads an ini files group and sets the table.names | |||
Table. | <nowiki>function INI_ReadProjectinfo(Table, xPath, xGroup, xFile) | ||
Table. | Table.ProjectContactEmail = GetIniValue(xPath, xFile, xGroup, "ProjectQuestion.ProjectContactEmail", "S") | ||
Table. | Table.ProjectContactName = GetIniValue(xPath, xFile, xGroup, "ProjectQuestion.ProjectContactName", "S") | ||
Table.ProjectContactPhoneNumber = GetIniValue(xPath, xFile, xGroup, "ProjectQuestion.ProjectContactPhoneNumber", "S") | |||
Table.ProjectName = GetIniValue(xPath, xFile, xGroup, "ProjectQuestion.ProjectName", "S") | |||
Table.ProjectPath = GetIniValue(xPath, xFile, xGroup, "ProjectQuestion.ProjectPath", "S") | |||
Table.StartDate = GetIniValue(xPath, xFile, xGroup, "ProjectQuestion.StartDate", "S") | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
===INI_UpdateItem=== | |||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Deletes old ini (.bak) file | |||
Copys the .ini to a backup (.bak) new file | |||
Reads the new backup file and writes a new file to the xGroup | |||
Writes new xValue for the for the xItem | |||
Reads and writes a new file to end of file | |||
<nowiki>function INI_UpdateItem(xPath, xFile, xGroup, xItem, xValue) | |||
local NfileName = xPath .. "\\" .. xFile .. ".ini" | |||
local OfileName = xPath .. "\\" .. xFile .. ".bak" | |||
os.remove(OfileName) | |||
end -- end | if CopyFileFromTo(NfileName, OfileName) then-- makes backup file | ||
local fileR = io.open(OfileName) | |||
local fileW = io.open(NfileName, "w") | |||
if fileR and fileW then | |||
local groups = false | |||
local txt = "" | |||
for Line in fileR:lines() do | |||
txt = Line | |||
if All_Trim(Line) == "[" .. All_Trim(xGroup) .. "]" then -- Group | |||
-- | groups = true | ||
end -- if end | |||
if xItem == string.sub(Line, 1, string.len(xItem)) then -- Item | |||
if groups then | |||
txt = xItem .. " = " .. xValue | |||
groups = false | |||
end -- if end | |||
end -- if end | |||
fileW:write(txt .. "\n") | |||
txt = "" | |||
end -- for end | |||
os.remove(OfileName) | |||
fileR:close() | |||
fileW:close() | |||
end | |||
end | |||
return true | return true | ||
end | end -- function end</nowiki> | ||
---- | |||
-- ======= | |||
function | ===INI_ReadProject=== | ||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Reads the ini file for project data | |||
<nowiki>function INI_ReadProject(xPath, xFile, xGroup) | |||
-- Milling = {} | |||
Milling.LayerNameBackPocket = GetIniValue(xPath, xFile, xGroup, "Milling.LayerNameBackPocket", "S") | |||
Milling.LayerNameTopBottomCenterDado = GetIniValue(xPath, xFile, xGroup, "Milling.LayerNameTopBottomCenterDado", "S") | |||
Milling.LayerNameDrawNotes = GetIniValue(xPath, xFile, xGroup, "Milling.LayerNameDrawNotes", "S") | |||
Milling.LayerNameDrawFaceFrame = GetIniValue(xPath, xFile, xGroup, "Milling.LayerNameDrawFaceFrame", "S") | |||
Milling.BackPocketDepthWall = GetIniValue(xPath, xFile, xGroup, "Milling.BackPocketDepthWall", "N") | |||
Milling.BlindDadoSetbackWall = GetIniValue(xPath, xFile, xGroup, "Milling.BlindDadoSetbackWall", "N") | |||
Milling.CabDepthWall = GetIniValue(xPath, xFile, xGroup, "Milling.CabDepthWall", "N") | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
end -- | |||
-- ======= | ===INI_TestDeleteDups=== | ||
[[File:TopOfPage.png|right|30px|link=JimAndi Toolbox]] | |||
Reads the ini file for dups and deletes | |||
<nowiki>function INI_TestDeleteDups() | |||
--[[ Requires 3 global variables | |||
clean = {} | |||
dups = {} | |||
Names = {} | |||
]] | |||
local myPath = "C:\\Users\\CNC\\Documents\\test" | |||
local myName = "Tester" | |||
local myfile = "C:\\Users\\CNC\\Documents\\test\\Tester.ini" | |||
INI_ReadGroups(myfile, Names) | |||
FindDups(Names, dups, clean) | |||
for i,v in ipairs(dups) do | |||
INI_DeleteGroup(myPath, myName, v) | |||
end | end | ||
return | return true | ||
end -- function end</nowiki> | |||
==Data Import Tools== | |||
[[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | |||
This object is used to import data to a gadget. | |||
===Read_CSV=== | |||
Reads a CSV file based on header and format (Requires modifications per usage) | |||
<nowiki> function Read_CSV(xFile, Header) | |||
--Read_CSV(Door.CSVFile, true) | |||
local fileR = io.open(xFile) | |||
local | local xLine = "" | ||
local result = {} | |||
if fileR then | |||
for Line in fileR:lines() do | |||
xLine = Line | |||
if Header then | |||
Header = false | |||
else | |||
xLine = All_Trim(Line) | |||
for match in (xLine..","):gmatch("(.-)"..",") do | |||
table.insert(result, match) | |||
end -- for end | |||
Door.Count = tonumber(result[1]) | |||
Door.Height = tonumber(result[2]) | |||
end -- | Door.Width = tonumber(result[3]) | ||
result = {} | |||
end -- | while Door.Count > 0 do | ||
if Door.Style == StyleA.Name then | |||
</nowiki> | DoorStyleA() | ||
elseif Door.Style == StyleB.Name then | |||
DoorStyleB() | |||
elseif Door.Style == StyleC.Name then | |||
DoorStyleC() | |||
elseif Door.Style == StyleE.Name then | |||
DoorStyleE() | |||
elseif Door.Style == StyleF.Name then | |||
DoorStyleF() | |||
elseif Door.Style == StyleG.Name then | |||
DoorStyleG() | |||
else | |||
DisplayMessageBox("No Style Select!") | |||
end --if end | |||
Door.Count = Door.Count - 1 | |||
end -- for end | |||
end --if end | |||
Door.Record = Door.Record + 1 | |||
MyProgressBar:SetPercentProgress(ProgressAmount(Door.Record)) | |||
end --for end | |||
end --if end | |||
return true | |||
end -- function end </nowiki> | |||
---- | |||
== | ==Job Tools== | ||
[[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | [[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | ||
This object is a name-value pair that represents a Document Variable within a [[VectricJob]]. | This object is a name-value pair that represents a Document Variable within a [[VectricJob]]. | ||
<nowiki> | <nowiki>function ValidJob() | ||
-- A better error message | |||
-- = | local job = VectricJob() | ||
if not job.Exists then | |||
DisplayMessageBox("Error: Cannot run Gadget, no drawing found \n" .. | |||
"Please create a new file (drawing) and \n" .. | |||
"specify the material dimensions \n" | |||
-- ======= | ) | ||
function | return false | ||
else | |||
return true | |||
end -- if end | |||
end -- ValidJob end | |||
</nowiki> | |||
---- | |||
===MoveSetectedVectors=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function MoveSetectedVectors(job, NewBasePoint) | |||
local Selection = job.Selection | |||
if Selection.IsEmpty then | |||
MessageBox("LayoutImportedVectors: No vectors selected!") | |||
return false | |||
end | |||
local MySelection = Selection:GetBoundingBox(); | |||
if not NewBasePoint then | |||
NewBasePoint = Point2D(0,0) | |||
end | |||
local MyNewLocatioin = BasePoint - MySelection.BLC | |||
local Txform = TranslationMatrix2D(MyNewLocatioin) | |||
Selection:Transform(Txform) | |||
return true | |||
end </nowiki> | |||
---- | |||
===FixPath=== | |||
<nowiki>function FixPath(path) -- Lua Returns a fixed path | |||
return path:gsub("%\\", "/") | |||
end -- function end | |||
---- | |||
function FixPath(myPath) { -- JavaScript Tool Returns a fixed path | |||
/* myPath = "C:\\User\\Bob\\Home\\Drawings"; */ | |||
/* NewPath = "C:/User/Bob/Home/Drawings"; */ | |||
var NewPath = ""; | |||
var myLetter = ""; | |||
var CheckPathLen = myPath.length; | |||
for (let i = 0; i < myPath.length; i++) { | |||
myLetter = myPath.charAt(i) | |||
if myLetter.charCodeAt(0) == 92 { | |||
NewPath = NewPath + "/"; | |||
} else { | |||
NewPath = NewPath + myLetter; | |||
} | |||
} | |||
return NewPath; | |||
}</nowiki> | |||
---- | |||
===RotateSetectedVectors=== | |||
<nowiki>function RotateSetectedVectors(job, NewBasePoint, NewAngle) | |||
local Selection = job.Selection | |||
if not NewBasePoint then | |||
NewBasePoint = Point2D(0,0) | |||
end -- if end | |||
if not NewAngle then | |||
NewAngle = 0.0 | |||
end -- if end | |||
if Selection.IsEmpty then | |||
MessageBox("Error: Rotation function: No vectors selected!") | |||
return false | |||
end -- if end | |||
local MySelection = Selection:GetBoundingBox(); | |||
local MyNewLocatioin = BasePoint - MySelection.BLC | |||
local Txform = RotationMatrix2D(NewBasePoint, NewAngle) | |||
Selection:Transform(Txform) | |||
return true | return true | ||
end </nowiki> | |||
end | |||
---- | |||
== | ===GetUnits=== | ||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function GetUnits(UTable) -- returns Drawing Units data | |||
<nowiki> | local mtl_block = MaterialBlock() | ||
if mtl_block.InMM then | |||
UTable.Units = "Drawing Units: mm" | |||
UTable.Unit = true | |||
UTable.UnitCheck = {"metric", "kilometer", "kilometers", "kh", "meter", "meters", "m", "decimeter", "decimeters", "dm", "centimeter", "centimeters", "cm", "millimeter", "millimeters", "mm"} | |||
UTable.Cal = 25.4 | |||
function | else | ||
-- = | UTable.Units = "Drawing Units: inches" | ||
UTable.Unit = false | |||
UTable.UnitCheck = {"imperial", "miles", "mile", "mi", "yards", "yard", "yd", "feet", "foot", "ft", "inches", "inch", "in", "fractions", "fraction"} | |||
UTable.Cal = 1.0 | |||
end | end | ||
return true | return true | ||
end -- | end -- end function</nowiki> | ||
---- | |||
== | ===CheckTheUnits=== | ||
[[File: | [[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | ||
<nowiki>function CheckTheUnits(UTable, Value) -- Checks if the unit of messure in of drawing units | |||
local goodtogo = false | |||
for i=1, #UTable.UnitCheck do | |||
if string.upper(Value) == string.upper(UTable.UnitCheck[i]) then | |||
goodtogo = true | |||
break | |||
end -- if end | |||
end -- for end | |||
if goodtogo then | |||
return true | |||
else | |||
return false | |||
end -- if end | |||
end -- function end</nowiki> | |||
---- | |||
===GetMatlBlk=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function GetMatlBlk(Table) | |||
local mtl_block = MaterialBlock() | |||
if mtl_block.InMM then | |||
Table.Units = "Drawing Units: mm" | |||
function | Table.Unit = true | ||
else | |||
Table.Units = "Drawing Units: inches" | |||
Table.Unit = false | |||
end | |||
if mtl_block.Width> mtl_block.Height then | |||
Table.MaterialThickness = mtl_block.Height | |||
Table.MaterialLength = mtl_block.Width | |||
Table.Orantation = "H" | |||
else | |||
Table.MaterialThickness = mtl_block.Width | |||
Table.MaterialLength = mtl_block.Height | |||
Table.Orantation = "V" | |||
end | end | ||
Table.FrontThickness = Dovetail.MaterialThickness | |||
Table.SideThickness = Dovetail.MaterialThickness | |||
if mtl_block.Height == mtl_block.Width then | |||
MessageBox("Error! Material block cannot square") | |||
end | end | ||
return true | |||
end -- end function</nowiki> | |||
---- | |||
===GetBoxJointMaterialSettings=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function GetBoxJointMaterialSettings(Table) | |||
local mtl_block = MaterialBlock() | |||
--local units | |||
if mtl_block.InMM then | |||
Table.Units = "Drawing Units: mm" | |||
Table.Unit = true | |||
else | else | ||
Table.Units = "Drawing Units: inches" | |||
Table.Unit = false | |||
end | end | ||
if mtl_block.Width > mtl_block.Height then | |||
Table.MaterialThickness = mtl_block.Height | |||
Table.MaterialLength = mtl_block.Width | |||
Table.Orantation = "H" | |||
else | else | ||
Table.MaterialThickness = mtl_block.Width | |||
Table.MaterialLength = mtl_block.Height | |||
Table.Orantation = "V" | |||
end | |||
if mtl_block.Height == mtl_block.Width then | |||
if | MessageBox("Error! Material block cannot square") | ||
end | |||
end | -- Display material XY origin | ||
local xy_origin_text = "invalid" | |||
local xy_origin = mtl_block.XYOrigin | |||
if xy_origin == MaterialBlock.BLC then | |||
Table.xy_origin_text = "Bottom Left Corner" | |||
if Table.Orantation == "V" then | |||
Table.Direction1 = 90.0 | |||
Table.Direction2 = 0.0 | |||
== | Table.Direction3 = 270.0 | ||
Table.Direction4 = 180.0 | |||
Table.Bulge = 1.0 | |||
else | |||
Table.Direction1 = 0.0 | |||
Table.Direction2 = 90.0 | |||
Table.Direction3 = 180.0 | |||
Table.Direction4 = 270.0 | |||
Table.Bulge = -1.0 | |||
end | |||
elseif xy_origin == MaterialBlock.BRC then | |||
Table.xy_origin_text = "Bottom Right Corner" | |||
if Table.Orantation == "V" then | |||
Table.Direction1 = 90.0 | |||
Table.Direction2 = 180.0 | |||
Table.Direction3 = 270.0 | |||
Table.Direction4 = 0.0 | |||
Table.Bulge = -1.0 | |||
else | |||
Table.Direction1 = 180.0 | |||
Table.Direction2 = 90.0 | |||
Table.Direction3 = 0.0 | |||
Table.Direction4 = 270.0 | |||
Table.Bulge = 1.0 | |||
end | |||
elseif xy_origin == MaterialBlock.TRC then | |||
Table.xy_origin_text = "Top Right Corner" | |||
if Table.Orantation == "V" then | |||
Table.Direction1 = 270.0 | |||
Table.Direction2 = 180.0 | |||
Table.Direction3 = 90.0 | |||
Table.Direction4 = 0.0 | |||
Table.Bulge = 1.0 | |||
else | |||
Table.Direction1 = 180.0 | |||
Table.Direction2 = 270.0 | |||
Table.Direction3 = 0.0 | |||
Table.Direction4 = 90.0 | |||
Table.Bulge = -1.0 | |||
end | |||
elseif xy_origin == MaterialBlock.TLC then | |||
Table.xy_origin_text = "Top Left Corner" | |||
if Table.Orantation == "V" then | |||
Table.Direction1 = 270.0 | |||
Table.Direction2 = 0.0 | |||
Table.Direction3 = 90.0 | |||
Table.Direction4 = 180.0 | |||
Table.Bulge = -1.0 | |||
else | |||
Table.Direction1 = 0.0 | |||
Table.Direction2 = 270.0 | |||
Table.Direction3 = 180.0 | |||
Table.Direction4 = 90.0 | |||
Table.Bulge = 1.0 | |||
end | |||
elseif xy_origin == MaterialBlock.CENTRE then -- NOTE: English spelling for Centre! | |||
Table.xy_origin_text = "Center" | |||
if Table.Orantation == "V" then | |||
Table.Direction1 = 0.0 | |||
Table.Direction2 = 0.0 | |||
Table.Direction3 = 0.0 | |||
Table.Direction4 = 0.0 | |||
Table.Bulge = 1.0 | |||
else | |||
Table.Direction1 = 0.0 | |||
Table.Direction2 = 0.0 | |||
Table.Direction3 = 0.0 | |||
Table.Direction4 = 0.0 | |||
Table.Bulge = -1.0 | |||
end | |||
MessageBox("Error! " .. xy_origin_text .. " Must be set at a corner of the Material") | |||
else | |||
Table.xy_origin_text = "Unknown XY origin value!" | |||
MessageBox("Error! " .. xy_origin_text .. " Must be set at a corner of the Material") | |||
if Table.Orantation == "V" then | |||
Table.Direction1 = 0 | |||
Table.Direction2 = 0 | |||
Table.Direction3 = 0 | |||
Table.Direction4 = 0 | |||
else | |||
Table.Direction1 = 0 | |||
Table.Direction2 = 0 | |||
Table.Direction3 = 0 | |||
Table.Direction4 = 0 | |||
end | |||
end | |||
-- Setup Fingers and Gaps | |||
Table.NoFingers0 = 1 + (Rounder(BoxJoint.MaterialLength / BoxJoint.MaterialThickness, 0)) | |||
Table.NoFingers2 = Rounder(BoxJoint.NoFingers0 / 2, 0) | |||
Table.FingerSize = BoxJoint.MaterialLength / BoxJoint.NoFingers0 | |||
Table.NoFingers1 = BoxJoint.NoFingers0 - BoxJoint.NoFingers2 | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
===GetMaterialSettings=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function GetMaterialSettings(Table) | |||
local MaterialBlock = MaterialBlock() | |||
Table.MaterialBlockThickness = MaterialBlock.Thickness | |||
Table.xy_origin = MaterialBlock.XYOrigin | |||
if MaterialBlock.InMM then | |||
Table.Units = "Drawing Units: mm" | |||
Table.Unit = true | |||
Table.Cal = 25.4 | |||
else | |||
Table.Units = "Drawing Units: inches" | |||
Table.Unit = false | |||
Table.Cal = 1.0 | |||
end | |||
--local units | |||
if MaterialBlock.Width > MaterialBlock.Height then | |||
Table.Orantation = "H" -- Horizontal | |||
elseif MaterialBlock.Width < MaterialBlock.Height then | |||
Table.Orantation = "V" -- Vertical | |||
else | |||
Table.Orantation = "S" -- Squair | |||
end | |||
if Table.xy_origin == MaterialBlock.BLC then | |||
Table.XYorigin = "Bottom Left Corner" | |||
elseif Table.xy_origin == MaterialBlock.BRC then | |||
Table.XYorigin = "Bottom Right Corner" | |||
elseif Table.xy_origin == MaterialBlock.TRC then | |||
Table.XYorigin = "Top Right Corner" | |||
else | |||
Table.XYorigin = "Top Left Corner" | |||
end -- if end | |||
Table.UnitDisplay = "Note: Units: (" .. Table.Units ..")" | |||
return true | |||
end -- end function</nowiki> | |||
---- | |||
===IsSingleSided=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function IsSingleSided(Table) | |||
local SingleSided = Table.job.IsSingleSided | |||
if not SingleSided then | |||
DisplayMessageBox("Error: Job must be a single sided job") | |||
return false | |||
end -- if end | |||
end -- function end</nowiki> | |||
---- | |||
-- | |||
===IsDoubleSided=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function IsDoubleSided(Table) | |||
if not Table.job.IsDoubleSided then | |||
DisplayMessageBox("Error: Job must be a Double Sided Project") | |||
return false | |||
else | |||
return true | |||
end -- if end | |||
end-- function end</nowiki> | |||
---- | |||
===ShowSetting=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function ShowSetting(Table) | |||
local name = "" | |||
DisplayMessageBox( | |||
name .. " MaterialThickness = " .. tostring(Table.MaterialThickness) .."\n" .. | |||
name .. " BottleRad = " .. tostring(Table.BottleRad) .."\n" .. | |||
name .. " SideLenght = " .. tostring(Table.SideLenght) .."\n" .. | |||
name .. " SideHight = " .. tostring(Table.SideHight) .."\n" .. | |||
name .. " EndLenght = " .. tostring(Table.EndLenght) .."\n" .. | |||
name .. " EndHight = " .. tostring(Table.EndHight) .."\n" .. | |||
name .. " TopLenght = " .. tostring(Table.TopLenght) .."\n" .. | |||
name .. " TopWidht = " .. tostring(Table.TopWidht) .."\n" .. | |||
name .. " HandleLenght = " .. tostring(Table.HandleLenght) .."\n" .. | |||
name .. " HandleWidht = " .. tostring(Table.HandleWidht) .."\n" .. | |||
name .. " HandleRad = " .. tostring(Table.HandleRad) .."\n" .. | |||
name .. " MillingBitRad = " .. tostring(Table.MillingBitRad) .."\n" .. | |||
"\n") | |||
end -- function end</nowiki> | |||
---- | |||
===MakeLayers=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function MakeLayers() | |||
local Red, Green, Blue = 0, 0, 0 | |||
local function GetColor(str) -- returns color value for a Color Name | |||
local sx = str | |||
local Red = 0 | |||
local Green = 0 | |||
local Blue = 0 | |||
local Colors = {} | |||
Colors.Black = "0,0,0" | |||
end | Colors.Red = "255,0,0" | ||
Colors.Blue = "0,0,255" | |||
Colors.Yellow = "255,255,0" | |||
local | Colors.Cyan = "0,255,255" | ||
Colors.Magenta = "255,0,255" | |||
Colors.Green = "0,128,0" | |||
if "" == str then | |||
DisplayMessageBox("Error: Empty string passed") | |||
else | |||
str = Colors[str] | |||
if "string" == type(str) then | |||
if string.find(str, ",") then | |||
Red = tonumber(string.sub(str, 1, assert(string.find(str, ",") - 1))) | |||
str = string.sub(str, assert(string.find(str, ",") + 1)) | |||
Green = tonumber(string.sub(str, 1, assert(string.find(str, ",") - 1))) | |||
Blue = tonumber(string.sub(str, assert(string.find(str, ",") + 1))) | |||
end | |||
else | |||
DisplayMessageBox("Error: Color " .. sx .. " not Found" ) | |||
Red = 0 | |||
Green = 0 | |||
Blue = 0 | |||
end | |||
end | |||
return Red, Green, Blue | |||
end | |||
local layer = Milling.job.LayerManager:GetLayerWithName(Milling.LNBackPocket) | |||
Red, Green, Blue = GetColor(Milling.LNBackPocketColor) | |||
layer:SetColor (Red, Green, Blue) | |||
layer = Milling.job.LayerManager:GetLayerWithName(Milling.LNBackProfile) | |||
Red, Green, Blue = GetColor(Milling.LNBackProfileColor) | |||
layer:SetColor (Red, Green, Blue) | |||
return true | return true | ||
end -- function end | end -- function end</nowiki> | ||
-- ======= | |||
function | ---- | ||
local | |||
===MyLayerClear=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function MyLayerClear(LayerName) | |||
local Mylayer = Milling.job.LayerManager:GetLayerWithName(LayerName) | |||
if Mylayer.IsEmpty then | |||
Milling.job.LayerManager:RemoveLayer(Mylayer) | |||
end -- if end | |||
return true | return true | ||
end -- function end | end -- function end</nowiki> | ||
-- ======= | |||
function | ---- | ||
===LayerClear=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function LayerClear() -- calling MyLayerClear | |||
MyLayerClear(Milling.LNBackPocket .. "-Wall") | |||
MyLayerClear(Milling.LNBackPocket .. "-Base") | |||
MyLayerClear(Milling.LNBackProfile .. "-Wall") | |||
MyLayerClear(Milling.LNBackProfile .. "-Base") | |||
MyLayerClear("PartLabels") | |||
return true | return true | ||
end -- function end | end -- function end | ||
</nowiki> | </nowiki> | ||
== | ==Logic and Test Tools== | ||
[[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | [[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | ||
These functions are named as per there function or action. | |||
---- | |||
===CheckNumber=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function CheckNumber(num) | |||
if type(num) == "number" then | |||
return true | |||
else | |||
function | return false | ||
-- ======= | end -- if end | ||
function | end -- function end</nowiki> | ||
---- | |||
-- | ===AboveZero=== | ||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
]] | <nowiki>function AboveZero(num) | ||
if (type(num) == "number") and (num > 0.0)then | |||
return true | |||
else | |||
return false | |||
end -- if end | |||
end | end -- function end | ||
-- ======= | |||
function | </nowiki> | ||
---- | |||
===IsNumber()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function IsNumber(Val) --Return true if Val is number | |||
if tonumber(x) ~= nil then | |||
return true | |||
end -- if end | |||
return false | |||
end -- end function</nowiki> | |||
---- | |||
===IsEven()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function IsEven(IsEven_Number) -- Returns True/False if number is even | |||
if (IsEven_Number % 2 == 0) then | |||
return true | |||
else | |||
return false | |||
end -- if end | |||
end -- function end</nowiki> | |||
---- | |||
return | |||
end | ===IsOdd()=== | ||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function IsOdd(IsOdd_Number) -- Returns True/False if number is odd | |||
if(IsOdd_Number%2 == 0) then | |||
return false | |||
end -- end if | |||
return true | |||
end -- function end</nowiki> | |||
end -- function end | ---- | ||
-- ======= | |||
function | ===IsNegative()=== | ||
local | [[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | ||
local | <nowiki>function IsNegative(x) -- Returns True/False if number is a negative number | ||
for i = 1, | if x >=0.0 then | ||
return false | |||
if | else | ||
return true | |||
end | end -- if end | ||
end | end -- function end</nowiki> | ||
return | |||
end -- function end | ---- | ||
===IsAllNumber()=== | |||
function | [[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | ||
<nowiki>function IsAllNumber(str) -- Returns True/False if finds all numbers in string | |||
local out = true | |||
local let = "" | |||
for i = 1, #str do | |||
let = str:byte(i) | |||
if (let ~= 48) and (let ~= 49) and (let ~= 50) and (let ~= 51) and | |||
(let ~= 52) and (let ~= 53) and (let ~= 54) and (let ~= 55) and | |||
(let ~= 56) and (let ~= 57) and (let ~= 46) then | |||
out = false | |||
end | end -- if end | ||
end -- for end | |||
end -- function | return out -- send out the return | ||
-- ================================================== | end -- function end</nowiki> | ||
local | |||
---- | |||
===NonNumber()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function NonNumber(Val) -- Return true if val is not number | |||
if tonumber(x) ~= nil then | |||
end -- function end | return false | ||
-- ======================================= | end -- if end | ||
function | return true | ||
end -- end function</nowiki> | |||
---- | |||
===NumberType()=== | |||
if | [[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | ||
<nowiki>function NumberType(Val) -- Return true if val is not number | |||
if math.type(x) == "integer" then | |||
return "integer" | |||
else | |||
return "float" | |||
end -- if end | |||
end -- end function</nowiki> | |||
---- | |||
==Math Tools== | |||
[[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | |||
This object is a name-value pair that represents a Document Variable within a [[VectricJob]]. | |||
---- | |||
===ArcSegment()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function ArcSegment(p1, p2, Rad) -- Returns the Arc Segment | |||
local chord = math.sqrt(((p2.x - p1.x) ^ 2) + ((p2.y - p1.y) ^ 2)) | |||
local segment = (Rad - (0.5 * (math.sqrt((4.0 * Rad^2) - chord^2)))) | |||
return segment | |||
end -- function end</nowiki> | |||
---- | |||
===D(x) Doubles x=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function D(x) -- Returns double the value | |||
return x * 2.0 | |||
end -- function end</nowiki> | |||
---- | |||
===H(x) Halfs x=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function H(x) -- Returns half the value | |||
return x * 0.5 | |||
end -- function end</nowiki> | |||
---- | |||
===C(x) Returns x by scale=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function C(x) -- Returns scale value | |||
return x * Project.Cal | |||
end -- function end</nowiki> | |||
---- | |||
===ChordSag2Radius()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function ChordSag2Radius (Chr, Seg) -- Returns the Rad from Chord and Seg | |||
local rad = ((((Chr * Chr)/(Seg * 4)) + Seg) / 2.0) | |||
return rad | |||
end -- function end</nowiki> | |||
---- | |||
===RadSag2Chord()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function RadSag2Chord(Rad, Seg) -- Returns the Chord from Rad and Seg | |||
local Ang = 2 * math.acos(1 - (Seg/Rad)) | |||
local Chord = (2 * Rad) * math.sin(Ang * 0.5) | |||
return Chord | |||
end -- function end</nowiki> | |||
---- | |||
===RadChord2Segment()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function RadChord2Segment (Rad, Chord) -- Returns the Arc Segment from Rad and Chord | |||
local segment = (Rad - (0.5 * (math.sqrt((4.0 * Rad^2) - Chord^2)))) | |||
return segment | |||
end -- function end</nowiki> | |||
---- | |||
===RoundTo()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function RoundTo(Num, Per) -- Returns the number from | |||
local Head = Num < 0 and math.ceil(Num) or math.floor(Num) | |||
local Tail = Num - Head | |||
local Value = Head + tonumber(string.sub(tostring(Tail), 1, Per + 2)) | |||
return Value | |||
end -- function end</nowiki> | |||
---- | |||
===Round()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function Round(x) | |||
return x>=0 and math.floor(x+0.5) or math.ceil(x-0.5) | |||
end</nowiki> | |||
---- | |||
===DecimalPlaces()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function DecimalPlaces(Dnum, Plac) | |||
return tonumber(string.sub(tostring(Dnum) .. "000000000000000000000000000000000000",1, string.len(tostring(math.floor(Dnum))) + 1 + Plac)) | |||
end</nowiki> | |||
---- | |||
===ToInteger()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function ToInteger( x ) | |||
local num = tonumber( x ) | |||
return num < 0 and math.ceil( num ) or math.floor( num ) | |||
end </nowiki> | |||
---- | |||
===TrigIt=== | |||
Finds all 5 properties of a triangle | |||
<nowiki>function TrigIt(A, B, AB, AC, BC) | |||
-- Sub Function to help other functions | |||
-- Call = A, B, AB, AC, BC = Trig(A, B, AB, AC, BC) | |||
-- C is the corner, A = small ang and B is the big angle | |||
-- returns all values | |||
-- A, B = angles | |||
-- C = 90.0 Deg | |||
-- B to C (BC) is Run - Base - adjacent | |||
-- A to C (AC) is Rise - Height - opposite | |||
-- A to B (AB) is Slope - hypotenuse | |||
if (B > 0.0) and (A == 0.0) then | |||
A = math.deg(math.rad(90) - math.rad(B)) | |||
end | |||
if (A > 0.0) and (B == 0.0) then | |||
B = math.deg(math.rad(90) - math.rad(A)) | |||
end | end | ||
if (AC > 0.0) and (BC > 0.0) then | |||
AB = math.sqrt((AC ^ 2) + (BC ^ 2)) | |||
A = math.deg(math.atan(BC/AC)) | |||
B = math.deg(math.rad(90) - math.rad(A)) | |||
elseif (AB > 0.0) and (BC > 0.0) then | |||
AB = math.sqrt((AB ^ 2) - (BC ^ 2)) | |||
A = math.deg(math.atan(BC/AC)) | |||
B = math.deg(math.rad(90) - math.rad(A)) | |||
elseif (AB > 0.0) and (AC > 0.0) then | |||
AB = math.sqrt((AB ^ 2) - (AC ^ 2)) | |||
A = math.deg(math.atan(BC/AC)) | |||
B = math.deg(math.rad(90) - math.rad(A)) | |||
elseif (A > 0.0) and (AC > 0.0) then | |||
AB = AC / math.cos(math.rad(A)) | |||
BC = AB * math.sin(math.rad(A)) | |||
elseif (A > 0.0) and (BC > 0.0) then | |||
AB = BC / math.sin(math.rad(A)) | |||
AC = AB * math.cos(math.rad(A)) | |||
elseif (A > 0.0) and (AB > 0.0) then | |||
BC = AB * math.sin(math.rad(A)) | |||
AC = AB * math.cos(math.rad(A)) | |||
else | |||
MessageBox("Error: No Missing Value") | |||
end -- if end | |||
return A, B, AB, AC, BC | |||
end</nowiki> | |||
---- | |||
==Registry Read and Write Tools== | |||
[[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | |||
This object is a name-value pair that represents a Document Variable within a [[VectricJob]]. | |||
---- | |||
===DocVarChk()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function DocVarChk(Name, Value) | |||
function | local job = VectricJob() | ||
local | local document_variable_list = job.DocumentVariables | ||
return document_variable_list:DocumentVariableExists(Name) | |||
end -- function end</nowiki> | |||
---- | |||
===DocVarGet()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function DocVarGet(Name) | |||
local job = VectricJob() | |||
local document_variable_list = job.DocumentVariables | |||
return document_variable_list:GetDocumentVariable(Name, 0.0) | |||
end -- function end</nowiki> | |||
---- | |||
===DocVarSet()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function DocVarSet(Name, Value) | |||
local job = VectricJob() | |||
local document_variable_list = job.DocumentVariables | |||
return document_variable_list:SetDocumentVariable(Name, Value) | |||
end -- function end</nowiki> | |||
---- | |||
===RegistryReadMaterial()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function RegistryReadMaterial() -- Read from Registry Material values for LUA Bit | |||
local RegistryRead = Registry("Material") | |||
Milling.SafeZGap = Rounder(RegistryRead:GetString("SafeZGap", "0.500"), 4) | |||
Milling.StartZGap = Rounder(RegistryRead:GetString("StartZGap", "0.500"), 4) | |||
Milling.HomeX = Rounder(RegistryRead:GetString("HomeX", "0.000"), 4) | |||
Milling.HomeY = Rounder(RegistryRead:GetString("HomeY", "0.000"), 4) | |||
Milling.HomeZGap = Rounder(RegistryRead:GetString("HomeZGap", "0.750"), 4) | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
===RegistryLastTenFiles()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function RegistryLastTenFiles(FileName) -- Adds to the top ten Log file list | |||
local Registry = Registry(RegName) | |||
LogFile.File10 = Registry:GetString("LogFile.File09", "No Log Yet" ) | |||
LogFile.File09 = Registry:GetString("LogFile.File08", "No Log Yet" ) | |||
LogFile.File08 = Registry:GetString("LogFile.File07", "No Log Yet" ) | |||
LogFile.File07 = Registry:GetString("LogFile.File06", "No Log Yet" ) | |||
LogFile.File06 = Registry:GetString("LogFile.File05", "No Log Yet" ) | |||
LogFile.File05 = Registry:GetString("LogFile.File04", "No Log Yet" ) | |||
LogFile.File04 = Registry:GetString("LogFile.File03", "No Log Yet" ) | |||
LogFile.File03 = Registry:GetString("LogFile.File02", "No Log Yet" ) | |||
LogFile.File02 = Registry:GetString("LogFile.File01", "No Log Yet" ) | |||
LogFile.File01 = FileName | |||
return FileName | |||
end -- function end</nowiki> | |||
---- | |||
===RegistryRead()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function RegistryRead() -- Read from Registry values | |||
local RegistryRead = Registry("RegName") | |||
local Yes_No = RegistryRead:GetBool("BaseDim.Yes_No", ture) | |||
local CabHeight = RegistryRead:GetDouble("BaseDim.CabHeight", 35.500) | |||
local CabCount = RegistryRead:GetInt("BaseDim.CabCount", 36) | |||
local Name = RegistryRead:GetString("BaseDim.Name", "Words") | |||
Milling.MillTool1.FeedRate = RegistryRead:GetDouble("Milling.MillTool1.FeedRate", 30.000) | |||
Milling.MillTool1.InMM = RegistryRead:GetBool("Milling.MillTool1.InMM ", false) | |||
Milling.MillTool1.Name = RegistryRead:GetString("Milling.MillTool1.Name", "No Tool Selected") | |||
Milling.MillTool1.BitType = RegistryRead:GetString("Milling.MillTool1.BitType", "END_MILL") -- BALL_NOSE, END_MILL, VBIT | |||
Milling.MillTool1.RateUnits = RegistryRead:GetInt("Milling.MillTool1.RateUnits", 4) | |||
Milling.MillTool1.SpindleSpeed = RegistryRead:GetInt("Milling.MillTool1.SpindleSpeed", 20000) | |||
Milling.MillTool1.ToolNumber = RegistryRead:GetInt("Milling.MillTool1.ToolNumber", 1) | |||
Milling.MillTool1.Stepdown = RegistryRead:GetDouble("Milling.MillTool1.Stepdown", 0.2000) | |||
Milling.MillTool1.Stepover = RegistryRead:GetDouble("Milling.MillTool1.Stepover", 0.0825) | |||
Milling.MillTool1.ToolDia = RegistryRead:GetDouble("Milling.MillTool1.ToolDia", 0.1250) | |||
Milling.MillTool1.PlungeRate = RegistryRead:GetDouble("Milling.MillTool1.PlungeRate", 15.000) | |||
Milling.MillTool2.FeedRate = RegistryRead:GetDouble("Milling.MillTool2.FeedRate", 30.000) | |||
Milling.MillTool2.InMM = RegistryRead:GetBool("Milling.MillTool2.InMM ", false) | |||
Milling.MillTool2.Name = RegistryRead:GetString("Milling.MillTool2.Name", "No Tool Selected") | |||
Milling.MillTool2.BitType = RegistryRead:GetString("Milling.MillTool2.BitType", "BALL_NOSE") -- BALL_NOSE, END_MILL, VBIT | |||
Milling.MillTool2.RateUnits = RegistryRead:GetInt("Milling.MillTool2.RateUnits", 4) | |||
Milling.MillTool2.SpindleSpeed = RegistryRead:GetInt("Milling.MillTool2.SpindleSpeed", 20000) | |||
Milling.MillTool2.ToolNumber = RegistryRead:GetInt("Milling.MillTool2.ToolNumber", 2) | |||
Milling.MillTool2.Stepdown = RegistryRead:GetDouble("Milling.MillTool2.Stepdown", 0.2000) | |||
Milling.MillTool2.Stepover = RegistryRead:GetDouble("Milling.MillTool2.Stepover", 0.0825) | |||
Milling.MillTool2.ToolDia = RegistryRead:GetDouble("Milling.MillTool2.ToolDia", 0.1250) | |||
Milling.MillTool2.PlungeRate = RegistryRead:GetDouble("Milling.MillTool2.PlungeRate", 15.000) | |||
Milling.MillTool3.FeedRate = RegistryRead:GetDouble("Milling.MillTool3.FeedRate", 30.000) | |||
Milling.MillTool3.InMM = RegistryRead:GetBool("Milling.MillTool3.InMM", false) | |||
Milling.MillTool3.Name = RegistryRead:GetString("Milling.MillTool3.Name", "No Tool Selected") | |||
Milling.MillTool3.BitType = RegistryRead:GetString("Milling.MillTool3.BitType", "END_MILL") -- BALL_NOSE, END_MILL, VBIT | |||
Milling.MillTool3.RateUnits = RegistryRead:GetInt("Milling.MillTool3.RateUnits", 4) | |||
Milling.MillTool3.SpindleSpeed = RegistryRead:GetInt("Milling.MillTool3.SpindleSpeed", 20000) | |||
Milling.MillTool3.ToolNumber = RegistryRead:GetInt("Milling.MillTool3.ToolNumber", 3) | |||
Milling.MillTool3.Stepdown = RegistryRead:GetDouble("Milling.MillTool3.Stepdown", 0.2000) | |||
Milling.MillTool3.Stepover = RegistryRead:GetDouble("Milling.MillTool3.Stepover", 0.0825) | |||
Milling.MillTool3.ToolDia = RegistryRead:GetDouble("Milling.MillTool3.ToolDia", 0.1250) | |||
Milling.MillTool3.PlungeRate = RegistryRead:GetDouble("Milling.MillTool3.PlungeRate", 15.000) | |||
Milling.MillTool4.FeedRate = RegistryRead:GetDouble("Milling.MillTool4.FeedRate", 30.000) | |||
Milling.MillTool4.InMM = RegistryRead:GetBool("Milling.MillTool4.InMM ", false) | |||
Milling.MillTool4.Name = RegistryRead:GetString("Milling.MillTool4.Name", "No Tool Selected") | |||
Milling.MillTool4.PlungeRate = RegistryRead:GetDouble("Milling.MillTool4.PlungeRate", 15.000) | |||
Milling.MillTool4.RateUnits = RegistryRead:GetInt("Milling.MillTool4.RateUnits", 4) | |||
Milling.MillTool4.SpindleSpeed = RegistryRead:GetInt("Milling.MillTool4.SpindleSpeed", 20000) | |||
Milling.MillTool4.Stepdown = RegistryRead:GetDouble("Milling.MillTool4.Stepdown", 0.2000) | |||
Milling.MillTool4.Stepover = RegistryRead:GetDouble("Milling.MillTool4.Stepover", 0.0825) | |||
Milling.MillTool4.ToolDia = RegistryRead:GetDouble("Milling.MillTool4.ToolDia", 0.1250) | |||
Milling.MillTool4.ToolNumber = RegistryRead:GetInt("Milling.MillTool4.ToolNumber", 5) | |||
</nowiki> | Milling.MillTool5.FeedRate = RegistryRead:GetDouble("Milling.MillTool5.FeedRate", 30.000) | ||
Milling.MillTool5.InMM = RegistryRead:GetBool("Milling.MillTool5.InMM ", false) | |||
Milling.MillTool5.Name = RegistryRead:GetString("Milling.MillTool5.Name", "No Tool Selected") | |||
Milling.MillTool5.PlungeRate = RegistryRead:GetDouble("Milling.MillTool5.PlungeRate", 15.000) | |||
Milling.MillTool5.RateUnits = RegistryRead:GetInt("Milling.MillTool5.RateUnits", 4) | |||
Milling.MillTool5.SpindleSpeed = RegistryRead:GetInt("Milling.MillTool5.SpindleSpeed", 20000) | |||
Milling.MillTool5.Stepdown = RegistryRead:GetDouble("Milling.MillTool5.Stepdown", 0.2000) | |||
Milling.MillTool5.Stepover = RegistryRead:GetDouble("Milling.MillTool5.Stepover", 0.0825) | |||
Milling.MillTool5.ToolDia = RegistryRead:GetDouble("Milling.MillTool5.ToolDia", 0.1250) | |||
Milling.MillTool5.ToolNumber = RegistryRead:GetInt("Milling.MillTool5.ToolNumber", 6) | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
== | ===RegistryWrite()=== | ||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
[[File: | <nowiki>function RegistryWrite() -- Write to Registry values | ||
local RegistryWrite = Registry("RegName") | |||
local RegValue | |||
RegValue = RegistryWrite:SetBool("ProjectQuestion.CabinetName", true) | |||
RegValue = RegistryWrite:SetDouble("BaseDim.CabDepth", 23.0000) | |||
RegValue = RegistryWrite:SetInt("BaseDim.CabHeight", 35) | |||
RegValue = RegistryWrite:SetString("BaseDim.CabLength", "Words") | |||
RegValue = RegistryWrite:SetDouble("Milling.MillTool1.FeedRate" , Milling.MillTool1.FeedRate) | |||
RegValue = RegistryWrite:SetBool("Milling.MillTool1.InMM", Milling.MillTool1.InMM) | |||
RegValue = RegistryWrite:SetString("Milling.MillTool1.Name", Milling.MillTool1.Name) | |||
RegValue = RegistryWrite:SetString("Milling.MillTool1.BitType", Milling.MillTool1.BitType) | |||
RegValue = RegistryWrite:SetDouble("Milling.MillTool1.PlungeRate" , Milling.MillTool1.PlungeRate) | |||
RegValue = RegistryWrite:SetInt("Milling.MillTool1.RateUnits", Milling.MillTool1.RateUnits) | |||
RegValue = RegistryWrite:SetInt("Milling.MillTool1.SpindleSpeed", Milling.MillTool1.SpindleSpeed) | |||
RegValue = RegistryWrite:SetDouble("Milling.MillTool1.Stepdown" , Milling.MillTool1.Stepdown) | |||
RegValue = RegistryWrite:SetDouble("Milling.MillTool1.Stepover" , Milling.MillTool1.Stepover) | |||
RegValue = RegistryWrite:SetDouble("Milling.MillTool1.ToolDia" , Milling.MillTool1.ToolDia) | |||
RegValue = RegistryWrite:SetInt("Milling.MillTool1.ToolNumber", Milling.MillTool1.ToolNumber) | |||
RegValue = RegistryWrite:SetDouble("Milling.MillTool2.FeedRate" , Milling.MillTool2.FeedRate) | |||
RegValue = RegistryWrite:SetBool("Milling.MillTool2.InMM", Milling.MillTool2.InMM) | |||
RegValue = RegistryWrite:SetString("Milling.MillTool2.Name", Milling.MillTool2.Name) | |||
RegValue = RegistryWrite:SetString("Milling.MillTool2.BitType", Milling.MillTool2.BitType) | |||
RegValue = RegistryWrite:SetDouble("Milling.MillTool2.PlungeRate" , Milling.MillTool2.PlungeRate) | |||
RegValue = RegistryWrite:SetInt("Milling.MillTool2.RateUnits", Milling.MillTool2.RateUnits) | |||
RegValue = RegistryWrite:SetInt("Milling.MillTool2.SpindleSpeed", Milling.MillTool2.SpindleSpeed) | |||
RegValue = RegistryWrite:SetDouble("Milling.MillTool2.Stepdown" , Milling.MillTool2.Stepdown) | |||
RegValue = RegistryWrite:SetDouble("Milling.MillTool2.Stepover" , Milling.MillTool2.Stepover) | |||
RegValue = RegistryWrite:SetDouble("Milling.MillTool2.ToolDia" , Milling.MillTool2.ToolDia) | |||
RegValue = RegistryWrite:SetInt("Milling.MillTool2.ToolNumber", Milling.MillTool2.ToolNumber) | |||
RegValue = RegistryWrite:SetDouble("Milling.MillTool3.FeedRate" , Milling.MillTool3.FeedRate) | |||
Milling = | RegValue = RegistryWrite:SetBool("Milling.MillTool3.InMM", Milling.MillTool3.InMM) | ||
RegValue = RegistryWrite:SetString("Milling.MillTool3.Name", Milling.MillTool3.Name) | |||
RegValue = RegistryWrite:SetString("Milling.MillTool3.BitType", Milling.MillTool3.BitType) | |||
RegValue = RegistryWrite:SetDouble("Milling.MillTool3.PlungeRate", Milling.MillTool3.PlungeRate) | |||
RegValue = RegistryWrite:SetInt("Milling.MillTool3.RateUnits", Milling.MillTool3.RateUnits) | |||
RegValue = RegistryWrite:SetInt("Milling.MillTool3.SpindleSpeed", Milling.MillTool3.SpindleSpeed) | |||
RegValue = RegistryWrite:SetDouble("Milling.MillTool3.Stepdown" , Milling.MillTool3.Stepdown) | |||
RegValue = RegistryWrite:SetDouble("Milling.MillTool3.Stepover" , Milling.MillTool3.Stepover) | |||
RegValue = RegistryWrite:SetDouble("Milling.MillTool3.ToolDia" , Milling.MillTool3.ToolDia) | |||
RegValue = RegistryWrite:SetInt("Milling.MillTool3.ToolNumber", Milling.MillTool3.ToolNumber) | |||
RegValue = RegistryWrite:SetDouble("Milling.MillTool4.FeedRate" , Milling.MillTool4.FeedRate) | |||
-- | RegValue = RegistryWrite:SetBool("Milling.MillTool4.InMM", Milling.MillTool4.InMM) | ||
RegValue = RegistryWrite:SetString("Milling.MillTool4.Name", Milling.MillTool4.Name) | |||
RegValue = RegistryWrite:SetDouble("Milling.MillTool4.PlungeRate" , Milling.MillTool4.PlungeRate) | |||
RegValue = RegistryWrite:SetInt("Milling.MillTool4.RateUnits", Milling.MillTool4.RateUnits) | |||
RegValue = RegistryWrite:SetInt("Milling.MillTool4.SpindleSpeed", Milling.MillTool4.SpindleSpeed) | |||
RegValue = RegistryWrite:SetDouble("Milling.MillTool4.Stepdown" , Milling.MillTool4.Stepdown) | |||
RegValue = RegistryWrite:SetDouble("Milling.MillTool4.Stepover" , Milling.MillTool4.Stepover) | |||
RegValue = RegistryWrite:SetDouble("Milling.MillTool4.ToolDia" , Milling.MillTool4.ToolDia) | |||
RegValue = RegistryWrite:SetInt("Milling.MillTool4.ToolNumber", Milling.MillTool4.ToolNumber) | |||
return true | |||
end -- function end</nowiki> | |||
-- | ---- | ||
===REG_CheckRegistryBool()=== | |||
-- | [[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | ||
<nowiki>function REG_CheckRegistryBool() -- Checks Registry for Bool values | |||
local RegistryRead = Registry("RegName") | |||
if RegistryRead:BoolExists("ProjectQuestion.Runtool") then | |||
DisplayMessageBox("Alert: The Runtool value is saved.") | |||
else | |||
DisplayMessageBox("Alert: The Runtool value is not saved.") | |||
end -- if end | |||
return true | |||
end -- function end</nowiki> | |||
-- | ---- | ||
-- | ===REG_CheckRegistryDouble()=== | ||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function REG_CheckRegistryDouble() -- Checks Registry for Double values | |||
local RegistryRead = Registry("RegName") | |||
if RegistryRead:DoubleExists("ProjectQuestion.ProjectCost") then | |||
DisplayMessageBox("Alert: The project cost is saved.") | |||
else | |||
DisplayMessageBox("Alert: The Project Cost is not saved.") | |||
end -- if end | |||
return true | |||
end -- function end</nowiki> | |||
---- | |||
===REG_CheckRegistryInt()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function REG_CheckRegistryInt() -- Checks Registry for Int values | |||
local RegistryRead = Registry("RegName") | |||
if RegistryRead:IntExists("ProjectQuestion.ProjectCount") then | |||
DisplayMessageBox("Alert: The Project Count is saved.") | |||
else | |||
DisplayMessageBox("Alert: The Project Count is not saved.") | |||
end -- if end | |||
return true | return true | ||
end | end -- function end</nowiki> | ||
---- | |||
== | ===REG_CheckRegistryString()=== | ||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function REG_CheckRegistryString() -- Checks Registry for String values | |||
local RegistryRead = Registry("RegName") | |||
if RegistryRead:StringExists("ProjectQuestion.ProjectPath") then | |||
DisplayMessageBox("Alert: The Project path is saved.") | |||
else | |||
DisplayMessageBox("Alert: The Project path is not saved.") | |||
end | |||
return true | |||
end -- function end</nowiki> | |||
==String Tools== | |||
[[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | [[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | ||
This object is a name-value pair that represents a Document Variable within a [[VectricJob]]. | This object is a name-value pair that represents a Document Variable within a [[VectricJob]]. | ||
---- | |||
===StringToArraySplit=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function StringToArraySplit(s, delimiter) | |||
--[[ | |||
split_string = StringToArraySplit("Hello World,Jim,Bill,Tom", ",") | |||
Returns = array | |||
-- split_string[1] = "Hello World,) | |||
-- split_string[2] = "Jim" | |||
]] | |||
result = {}; | |||
for match in (s..delimiter):gmatch("(.-)"..delimiter) do | |||
table.insert(result, match) | |||
end | |||
return result | |||
end | |||
</nowiki> | |||
---- | |||
===WrapString=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki> | |||
function WrapString(Str, Wid) -- wraps text at the nearest space and puts a return char in the space location | |||
--[[ How to use: | |||
Call WrapString(string, Number) | |||
function | WrapString("Jim is a tall man that lives in Texas. He was raised in North East Texas on 1000 acres from 1970 to 1982. This is a man that knows numbers of great people from a round the world.", 40) | ||
-- | returns "Jim is a tall man that lives in Texas.\n | ||
He was raised in North East Texas on\n | |||
1000 acres from 1970 to 1982. This is a man\n | |||
that knows numbers of great people from\n | |||
a round the world." | |||
]] | |||
local Wider = Wid | |||
local Posx = string.len(Str) | |||
local StrLen = string.len(Str) | |||
local pt = 0 | |||
local function FindSpace(MyStr) | |||
local Pos = string.len(MyStr) | |||
local str = MyStr | |||
if string.find(MyStr, " ") ~= nil then | |||
while Pos>0 do | |||
Pos = Pos - 1 | |||
if (string.byte(string.sub(str,-1)) == 32) then | |||
break | |||
else | |||
str = string.sub(str, 1, Pos) | |||
end | |||
end | |||
end | |||
return Pos | |||
end | |||
if StrLen > Wider then | |||
while Wider < Posx do | |||
pt = FindSpace(string.sub(Str,1, Wider)) | |||
end | Str = string.sub(Str, 1, pt) .. "\n" .. string.sub(Str, pt +2) | ||
Wider = Wider + Wid | |||
end | |||
end | |||
return Str | |||
end -- function end | |||
-- | </nowiki> | ||
---- | |||
===CleanString=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki> | |||
function CleanString(inStr) -- Check for ascii letters below 127 | |||
local outStr, str1 = "" | |||
local inStrLen = string.len(inStr) | |||
for i = 1, inStrLen ,1 do | |||
str1 = string.sub(inStr, i, i) | |||
end -- | if string.byte(str1) <= 127 then | ||
outStr=outStr .. str1 | |||
end | |||
end | |||
return outStr | |||
end -- function end | |||
</nowiki> | |||
---- | |||
-- | |||
</nowiki> | ===GetDiameterAndCentre=== | ||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki> | |||
function CheckString(YourStr) -- Check string for specal bite chars for HTML | |||
local function FindLetter(TheStr, TestChar) | |||
local outStr = false | |||
local strChar = "" | |||
local TheStrLen = string.len(TheStr) | |||
for i = 1, TheStrLen ,1 do | |||
strChar = string.sub(TheStr, i, i) | |||
if string.byte(strChar) == string.byte(TestChar) then | |||
outStr = true | |||
break | |||
end | |||
end | |||
return outStr | |||
end -- function end | |||
</nowiki> | |||
---- | |||
== | ===GetDiameterAndCentre=== | ||
[[File: | [[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | ||
<nowiki> | |||
local StrTest = false | |||
StrTest = SwitchLetter(YourStr, "&") -- Non frendly File Name letters | |||
StrTest = SwitchLetter(YourStr, "#") | |||
StrTest = SwitchLetter(YourStr, "@") | |||
StrTest = SwitchLetter(YourStr, "^") | |||
StrTest = SwitchLetter(YourStr, "$") | |||
return outStr | |||
end -- function end | |||
</nowiki> | |||
---- | |||
-- | |||
-- | |||
===MakeHTMLReady()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki> | |||
function MakeHTMLReady(MyStr) -- fix's string with special bite chars for HTML | |||
local function SwitchLetter(MyStr, MyChar, NewStr) | |||
local outStr, str1 = "" | |||
local inStrLen = string.len(MyStr) | |||
for i = 1, inStrLen ,1 do | |||
str1 = string.sub(MyStr, i, i) | |||
if string.byte(str1) == string.byte(MyChar) then | |||
outStr=outStr .. NewStr | |||
else | |||
outStr=outStr .. str1 | |||
end | |||
end | |||
return outStr | |||
end -- function end | |||
</nowiki> | |||
---- | |||
===SwitchLetterTest=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function SwitchLetterTest(MyStr) | |||
local outStr = "" | |||
outStr = SwitchLetter(MyStr, "!", "!") | |||
outStr = SwitchLetter(outStr, "#", "#") | |||
outStr = SwitchLetter(outStr, "$", "$") | |||
outStr = SwitchLetter(outStr, "%", "%") | |||
outStr = SwitchLetter(outStr, "&", "&") | |||
outStr = SwitchLetter(outStr, "'", "'") | |||
outStr = SwitchLetter(outStr, "(", "(") | |||
outStr = SwitchLetter(outStr, ")", ")") | |||
outStr = SwitchLetter(outStr, "*", "*") | |||
outStr = SwitchLetter(outStr, "+", "+") | |||
outStr = SwitchLetter(outStr, ",", ",") | |||
outStr = SwitchLetter(outStr, "-", "-") | |||
-- | outStr = SwitchLetter(outStr, ".", ".") | ||
outStr = SwitchLetter(outStr, "/", "/") | |||
outStr = SwitchLetter(outStr, ":", ":") | |||
outStr = SwitchLetter(outStr, ";", ";") | |||
outStr = SwitchLetter(outStr, "<", "<") | |||
outStr = SwitchLetter(outStr, "=", "=") | |||
outStr = SwitchLetter(outStr, ">", ">") | |||
outStr = SwitchLetter(outStr, "?", "?") | |||
-- | outStr = SwitchLetter(outStr, "@", "@") | ||
outStr = SwitchLetter(outStr, "[", "[") | |||
outStr = SwitchLetter(outStr, "]", "]") | |||
outStr = SwitchLetter(outStr, "^", "^") | |||
outStr = SwitchLetter(outStr, "_", "_") | |||
outStr = SwitchLetter(outStr, "`", "`") | |||
outStr = SwitchLetter(outStr, "{", "{") | |||
outStr = SwitchLetter(outStr, "|", "|") | |||
outStr = SwitchLetter(outStr, "}", "}") | |||
outStr = SwitchLetter(outStr, "~", "~") | |||
return outStr | |||
end -- function end | |||
</nowiki> | |||
---- | |||
===SwitchLetter()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function SwitchLetter(MyStr, MyChar, NewStr) -- swwap a leter for another letter | |||
local outStr, str1 = "" | |||
local inStrLen = string.len(MyStr) | |||
for i = 1, inStrLen ,1 do | |||
str1 = string.sub(MyStr, i, i) | |||
if string.byte(str1) == string.byte(MyChar) then | |||
outStr=outStr .. NewStr | |||
else | |||
outStr=outStr .. str1 | |||
end | |||
end | |||
return outStr | |||
end -- function end | |||
</nowiki> | |||
---- | |||
===PadC=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function PadC(str, lenth) -- Adds spaces to front and back to center text in lenth | |||
-- Local Word = PadC("K", 12) -- returns " K " | |||
if type(str) ~= "string" then | |||
str = tostring(str) | |||
end | |||
if string.len(str) < lenth then | |||
local a = math.floor(lenth - string.len(str) * 0.5) - 2 | |||
local b = math.ceil(lenth - string.len(str) * 0.5) - 2 | |||
--print ("a = " .. a) | |||
if | for _ = 1, a, 1 do | ||
str = " " .. str | |||
end | |||
for _ = 1, b, 1 do | |||
str = str .. " " | |||
end | |||
--print ("str len = " .. #str) | |||
end | |||
return str | |||
end -- function end | |||
</nowiki> | |||
---- | |||
===PadR()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function PadR(str, len) -- Adds spaces to Back of string | |||
-- Local Word = Pad("KPSDFKSPSK", 12) -- returns "KPSDFKSPSK " | |||
if type(str) ~= "string" then | |||
str = tostring(str) | |||
end | |||
while string.len(str) < len do | |||
str = str .. " " | |||
end | |||
return str | |||
end -- function end</nowiki> | |||
---- | |||
===PadL()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function PadL(str, len) -- Adds spaces to Front of string | |||
-- Local Word = Pad("KPSDFKSPSK", 12) -- returns " KPSDFKSPSK" | |||
if type(str) ~= "string" then | |||
str = tostring(str) | |||
end | |||
while string.len(str) < len do | |||
str = " " .. str | |||
end | |||
return str | |||
end -- function end</nowiki> | |||
---- | |||
===NumberPad()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function NumberPad(str, front, back) -- Adds spaces to front and zeros to the back of string | |||
local mychar | |||
local a,b,c,d = 0,0,0,0 | |||
local x,y,z = "","","" | |||
if type(str) ~= "string" then | |||
str = tostring(str) | |||
end | |||
c = string.len(str) | |||
for i = 1, c, 1 do | |||
mychar = string.byte(string.sub(str, i,i)) | |||
if mychar == 46 then | |||
b = i | |||
end | end | ||
end | |||
end | -- print("b = " .. b) | ||
-- ====== | if b == 0 then | ||
str = str .. "." | |||
c = c + 1 | |||
b = c | |||
end -- if loc | |||
x = string.sub(str, 1, b-1) | |||
y = string.sub(str, b+1) | |||
a = c - b | |||
a = #x | |||
d = #y | |||
if a < front then | |||
front = front - (a - 1) | |||
for _ = 1, front -1 do | |||
x = " " .. x | |||
end -- end for front | |||
end | |||
back = back - (c - b) | |||
for i = 1, back do | |||
y = y .. "0" | |||
end -- end for back | |||
str = x .. "." .. y | |||
return str | |||
end -- function end | |||
</nowiki> | |||
---- | |||
===All_Trim()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function All_Trim(s) -- Trims spaces off both ends of a string | |||
return s:match( "^%s*(.-)%s*$" ) | |||
end -- function end | |||
</nowiki> | |||
---- | |||
===MakeProperCase()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function MakeProperCase(str) | |||
local str=string.gsub(string.lower(str),"^(%w)", string.upper) | |||
return string.gsub(str,"([^%w]%w)", string.upper) | |||
end | |||
</nowiki> | |||
---- | |||
-- | |||
===ifT()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function ifT(x) -- Converts Boolean True or False to String "Yes" or "No" | |||
-- ===ifT(x)=== | |||
if x then | |||
return "Yes" | |||
else | |||
return "No" | |||
end-- if end | |||
end -- function end | |||
</nowiki> | |||
---- | |||
===ifY()=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function ifY(x) -- Converts String "Yes" or "No" to Boolean True or False | |||
-- ===ifY(x)=== | |||
if string.upper(x) == "YES" then | |||
return true | |||
else | |||
return false | |||
end-- if end | |||
end -- function end</nowiki> | |||
==Seed Documents== | |||
[https://jimandi.com/SDK/index.php/JimAndi_Toolbox (top)] | |||
[[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | |||
This object is a name-value pair that represents a Document Variable within a [[VectricJob]]. | |||
<nowiki>-- =====================================================]] | |||
╔═╗╔═╗╔═╗╔╦╗ ╔═╗╦ ╦╔╗╔╔═╗╔╦╗╦╔═╗╔╗╔ | |||
╚═╗║╣ ║╣ ║║ ╠╣ ║ ║║║║║ ║ ║║ ║║║║ | |||
╚═╝╚═╝╚═╝═╩╝ ╚ ╚═╝╝╚╝╚═╝ ╩ ╩╚═╝╝╚╝ | |||
-- =====================================================]] | |||
-- VECTRIC LUA SCRIPT | |||
-- =====================================================]] | |||
-- Gadgets are an entirely optional add-in to Vectric's core software products. | |||
-- They are provided 'as-is', without any express or implied warranty, and you make use of them entirely at your own risk. | |||
-- In no event will the author(s) or Vectric Ltd. be held liable for any damages arising from their use. | |||
-- Permission is granted to anyone to use this software for any purpose, | |||
-- including commercial applications, and to alter it and redistribute it freely, | |||
-- subject to the following restrictions: | |||
-- 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. | |||
-- 2. If you use this software in a product, an acknowledgement in the product documentation would be appreciated but is not required. | |||
-- 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. | |||
-- 4. This notice may not be removed or altered from any source distribution. | |||
-- Easy Seed Gadget Master is written by Jim Anderson of Houston Texas 2020 | |||
-- =====================================================]] | -- =====================================================]] | ||
-- require("mobdebug").start() | |||
-- require "strict" | |||
local Tools | |||
-- Global Variables -- | |||
local Ver = "1.0" -- Version 7: Aug 2021 - Clean Up and added Ver to Dialog | |||
-- Table Names | |||
Milling = {} | |||
Project = {} | |||
-- =====================================================]] | |||
function main(script_path) | |||
--[[ | |||
Gadget Notes: Dec 2019 - My New Gadget | |||
]] | |||
-- Localized Variables -- | |||
-- Job Validation -- | |||
local job = VectricJob() | |||
if not job.Exists then | |||
DisplayMessageBox("Error: No job loaded") | |||
return false | |||
end | |||
Tools = assert(loadfile(script_path .. "\\EasyGearToolsVer" .. Ver .. ".xlua")) (Tools) -- Load Tool Function | |||
-- Get Data -- | |||
-- Calculation -- | |||
-- Do Something -- | |||
-- | |||
return true | |||
-- | end -- function end</nowiki> | ||
-- | |||
==Setup Tools== | |||
-- | [[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | ||
This object is a name-value pair that represents a Document Variable within a [[VectricJob]]. | |||
-- | |||
<nowiki>-- =====================================================]] | |||
-- | ╔═╗╔═╗╔╦╗╦ ╦╔═╗ | ||
╚═╗║╣ ║ ║ ║╠═╝ | |||
-- | ╚═╝╚═╝ ╩ ╚═╝╩ | ||
function SetupAndLetter Seeds() | |||
-- | -- =====================================================]] | ||
function LUA_Seed() | |||
-- | -- VECTRIC LUA SCRIPT | ||
-- ============================================================================== | |||
-- | -- Gadgets are an entirely optional add-in to Vectric's core software products. | ||
-- They are provided 'as-is', without any express or implied warranty, and you | |||
-- | -- make use of them entirely at your own risk. | ||
-- In no event will the author(s) or Vectric Ltd. be held liable for any damages | |||
-- arising from their use. | |||
-- Permission is granted to anyone to use this software for any purpose, | |||
-- including commercial applications, and to alter it and redistribute it freely, | |||
-- subject to the following restrictions: | |||
-- 1. The origin of this software must not be misrepresented; | |||
-- you must not claim that you wrote the original software. | |||
-- If you use this software in a product, an acknowledgement in the product | |||
-- documentation would be appreciated but is not required. | |||
-- 2. Altered source versions must be plainly marked as such, and | |||
-- must not be misrepresented as being the original software. | |||
-- 3. This notice may not be removed or altered from any source distribution. | |||
-- ============================================================================== | |||
-- "AppName Here" was written by JimAndi Gadgets of Houston Texas | |||
-- ============================================================================== | |||
-- =====================================================]] | |||
-- require("mobdebug").start() | |||
-- require "strict" | |||
-- =====================================================]] | |||
-- Global variables | |||
end -- | -- =====================================================]] | ||
end -- lua function | |||
-- =====================================================]] | -- =====================================================]] | ||
function | function Install_letter() | ||
-- | -- Steps to Install: | ||
-- 1. Download the gadget x.zip that is attached to this post. | |||
-- 2. Rename it from x.zip to x.vgadget | |||
-- 3. In Vectric Pro or Aspire click on Gadgets -> Install Gadget and navigate to where you downloaded the file to, select it and click Ok. | |||
-- It should give you a pop up saying the gadget was installed and you should see x in the Gadgets menu. | |||
-- Image Here | |||
-- Steps for Use: | |||
-- 1. Select a layer that you want to calculate for | |||
-- 2. Enter the cut depth | |||
-- 3. Enter the percentage of coverage for the area that will be filled in | |||
-- 4. Enter the hardner to resin percentage | |||
-- 5. Click the Calculate Button and the results will be displayed below in the Results Pane. | |||
end -- install function | |||
end -- Header function | |||
-- =====================================================]] | |||
</nowiki> | |||
==Toolpathing Tools== | |||
[[File:Back.jpg|right|50px|link=Vectric Lua Interface for Gadgets]] | |||
This object is a name-value pair that represents a Document Variable within a [[VectricJob]]. | |||
---- | |||
-- | ===CreateLayerProfileToolpath=== | ||
local | [[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | ||
-- | <nowiki>function CreateLayerProfileToolpath(name, layer_name, start_depth, cut_depth, tool_dia, tool_stepdown, tool_in_mm) | ||
-- clear current selection | |||
local | local selection = job.Selection | ||
selection:Clear() | |||
-- get layer | |||
-- | local layer = job.LayerManager:FindLayerWithName(layer_name) | ||
if layer == nil then | |||
DisplayMessageBox("No layer found with name = " .. layer_name) | |||
return false | |||
DisplayMessageBox(" | end | ||
-- select all closed vectors on the layer | |||
if not SelectVectorsOnLayer(layer, selection, true, false, true) then | |||
DisplayMessageBox("No closed vectors found on layer " .. layer_name) | |||
return false | return false | ||
end | end | ||
-- Create tool we will use to machine vectors | |||
local tool = Tool("Lua End Mill", Tool.END_MILL) -- BALL_NOSE, END_MILL, VBIT | |||
local tool = Tool("Lua | |||
tool.InMM = tool_in_mm | tool.InMM = tool_in_mm | ||
tool.ToolDia = | tool.ToolDia = tool_dia | ||
tool.Stepdown = | tool.Stepdown = tool_stepdown | ||
tool.Stepover = | tool.Stepover = tool_dia * 0.25 | ||
tool.RateUnits = Tool.MM_SEC -- MM_SEC, MM_MIN, METRES_MIN, INCHES_SEC | tool.RateUnits = Tool.MM_SEC -- MM_SEC, MM_MIN, METRES_MIN, INCHES_SEC ... | ||
tool.FeedRate = 30 | tool.FeedRate = 30 | ||
tool.PlungeRate = 10 | tool.PlungeRate = 10 | ||
Line 5,800: | Line 6,138: | ||
tool.ToolNumber = 1 | tool.ToolNumber = 1 | ||
tool.VBit_Angle = 90.0 -- used for vbit only | tool.VBit_Angle = 90.0 -- used for vbit only | ||
tool.ClearStepover = | tool.ClearStepover = tool_dia * 0.5 -- used for vbit only | ||
-- Create object used to set home position and safez gap above material surface | -- Create object used to set home position and safez gap above material surface | ||
local pos_data = ToolpathPosData() | local pos_data = ToolpathPosData() | ||
pos_data:SetHomePosition(0, 0, 1.0) | |||
pos_data.SafeZGap = 5.0 | |||
-- Create object used to pass profile options | |||
local profile_data = ProfileParameterData() | |||
-- Create object used to pass | |||
local | |||
-- start depth for toolpath | -- start depth for toolpath | ||
profile_data.StartDepth = start_depth | |||
-- cut depth for toolpath this is depth below start depth | -- cut depth for toolpath this is depth below start depth | ||
profile_data.CutDepth = cut_depth | |||
-- | -- direction of cut - ProfileParameterData. | ||
-- CLIMB_DIRECTION or ProfileParameterData.CONVENTIONAL_DIRECTION | |||
-- | profile_data.CutDirection = ProfileParameterData.CLIMB_DIRECTION | ||
-- side we machine on - ProfileParameterData. | |||
-- | -- PROFILE_OUTSIDE, ProfileParameterData.PROFILE_INSIDE or | ||
-- ProfileParameterData.PROFILE_ON | |||
-- start | profile_data.ProfileSide = ProfileParameterData.PROFILE_OUTSIDE | ||
-- Allowance to leave on when machining | |||
-- | profile_data.Allowance = 0.0 | ||
-- true to preserve start point positions, false to reorder start | |||
-- | -- points to minimise toolpath length | ||
-- | profile_data.KeepStartPoints = false | ||
-- true if want to create 'square' external corners on toolpath | |||
-- if true | profile_data.CreateSquareCorners = false | ||
-- true to perform corner sharpening on internal corners (only with v-bits) | |||
-- | profile_data.CornerSharpen = false | ||
-- true to use tabs (position of tabs must already have been defined on vectors) | |||
-- | profile_data.UseTabs = false | ||
-- length for tabs if being used | |||
-- type of | profile_data.TabLength = 5.0 | ||
-- | -- Thickness for tabs if being used | ||
profile_data.TabThickness = 1.0 | |||
-- if | -- if true then create 3d tabs else 2d tabs | ||
profile_data.Use3dTabs = true | |||
-- if | -- if true in Aspire, project toolpath onto composite model | ||
profile_data.ProjectToolpath = false | |||
-- if we | -- Create object used to control ramping | ||
local ramping_data = RampingData() | |||
-- | -- if true we do ramping into toolpath | ||
ramping_data.DoRamping = false | |||
-- type of ramping to perform RampingData.RAMP_LINEAR , RampingData.RAMP_ZIG_ZAG | |||
-- or RampingData.RAMP_SPIRAL | |||
ramping_data.RampType = RampingData.RAMP_ZIG_ZAG | |||
-- how ramp is contrained - either by angle or distance RampingData.CONSTRAIN_DISTANCE | |||
-- or RampingData.CONSTRAIN_ANGLE | |||
ramping_data.RampConstraint = RampingData.CONSTRAIN_ANGLE | |||
-- if we are constraining ramp by distance, distance to ramp over | |||
ramping_data.RampDistance = 100.0 | |||
-- if we are contraining ramp by angle , angle to ramp in at (in degrees) | |||
ramping_data.RampAngle = 25.0 | |||
-- if we are contraining ramp by angle, max distance to travel before 'zig zaging' | |||
-- if zig zaging | |||
ramping_data.RampMaxAngleDist = 15 | |||
-- if true we restrict our ramping to lead in section of toolpath | |||
ramping_data.RampOnLeadIn = false | |||
-- Create object used to control lead in/out | |||
local lead_in_out_data = LeadInOutData() | |||
-- if true we create lead ins on profiles (not for profile on) | |||
lead_in_out_data.DoLeadIn = false | |||
-- if true we create lead outs on profiles (not for profile on) | |||
lead_in_out_data.DoLeadOut = false | |||
-- type of leads to create LeadInOutData.LINEAR_LEAD or LeadInOutData.CIRCULAR_LEAD | |||
lead_in_out_data.LeadType = LeadInOutData.CIRCULAR_LEAD | |||
-- length of lead to create | |||
lead_in_out_data.LeadLength = 10.0 | |||
-- Angle for linear leads | |||
lead_in_out_data.LinearLeadAngle = 45 | |||
-- Radius for circular arc leads | |||
lead_in_out_data.CirularLeadRadius = 5.0 | |||
-- distance to 'overcut' (travel past start point) when profiling | |||
lead_in_out_data.OvercutDistance = 0.0 | |||
-- Create object which can be used to automatically select geometry | -- Create object which can be used to automatically select geometry | ||
local geometry_selector = GeometrySelector() | local geometry_selector = GeometrySelector() | ||
-- if this is true we create 2d toolpaths previews in 2d view, if false we dont | |||
local create_2d_previews = true | |||
-- if this is true we will display errors and warning to the user | |||
local display_warnings = true | |||
-- Create our toolpath | -- Create our toolpath | ||
local toolpath_manager = ToolpathManager() | local toolpath_manager = ToolpathManager() | ||
local toolpath_id = toolpath_manager: | local toolpath_id = toolpath_manager:CreateProfilingToolpath(name, tool, profile_data, ramping_data, lead_in_out_data, pos_data, geometry_selector, create_2d_previews, display_warnings ) | ||
if toolpath_id == nil then | if toolpath_id == nil then | ||
DisplayMessageBox("Error creating toolpath") | DisplayMessageBox("Error creating toolpath") | ||
Line 5,864: | Line 6,224: | ||
end | end | ||
return true | return true | ||
end -- end function | end -- end function</nowiki> | ||
-- ======= | |||
---- | |||
===CreateProfileToolpath=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function CreateProfileToolpath(name, start_depth, cut_depth, tool_dia, tool_stepdown, tool_in_mm) | |||
-- Create tool we will use to machine vectors | -- Create tool we will use to machine vectors | ||
local tool = Tool("Lua | local tool = Tool("Lua End Mill", Tool.END_MILL) -- BALL_NOSE, END_MILL, VBIT | ||
tool.InMM = tool_in_mm | tool.InMM = tool_in_mm | ||
tool.ToolDia = | tool.ToolDia = tool_dia | ||
tool.Stepdown = | tool.Stepdown = tool_stepdown | ||
tool.Stepover = | tool.Stepover = tool_dia * 0.25 | ||
tool.RateUnits = Tool.MM_SEC -- MM_SEC, MM_MIN, METRES_MIN, INCHES_SEC | tool.RateUnits = Tool.MM_SEC -- MM_SEC, MM_MIN, METRES_MIN, INCHES_SEC ... | ||
tool.FeedRate = 30 | tool.FeedRate = 30 | ||
tool.PlungeRate = 10 | tool.PlungeRate = 10 | ||
Line 5,896: | Line 6,243: | ||
tool.ToolNumber = 1 | tool.ToolNumber = 1 | ||
tool.VBit_Angle = 90.0 -- used for vbit only | tool.VBit_Angle = 90.0 -- used for vbit only | ||
tool.ClearStepover = | tool.ClearStepover = tool_dia * 0.5 -- used for vbit only | ||
-- Create object used to set home position and safez gap above material surface | -- Create object used to set home position and safez gap above material surface | ||
local pos_data = ToolpathPosData() | local pos_data = ToolpathPosData() | ||
Line 5,902: | Line 6,249: | ||
pos_data.SafeZGap = 5.0 | pos_data.SafeZGap = 5.0 | ||
-- Create object used to pass profile options | -- Create object used to pass profile options | ||
local | local profile_data = ProfileParameterData() | ||
-- start depth for toolpath | -- start depth for toolpath | ||
profile_data.StartDepth = start_depth | |||
-- cut depth for toolpath this is depth below start depth | -- cut depth for toolpath this is depth below start depth | ||
prism_data.CutDepth = cut_depth | profile_data.CutDepth = cut_depth | ||
-- direction of cut for offet clearance - ProfileParameterData.CLIMB_DIRECTION | -- direction of cut - ProfileParameterData. | ||
-- or ProfileParameterData.CONVENTIONAL_DIRECTION - NOTE: enum from ProfileParameterData | -- CLIMB_DIRECTION or ProfileParameterData.CONVENTIONAL_DIRECTION | ||
prism_data.CutDirection = ProfileParameterData.CLIMB_DIRECTION | profile_data.CutDirection = ProfileParameterData.CLIMB_DIRECTION | ||
-- calculate the minimum cut depth to fully form the bevel on the current | -- side we machine on - ProfileParameterData. | ||
-- selection with the current tool | -- PROFILE_OUTSIDE, ProfileParameterData.PROFILE_INSIDE or | ||
local min_bevel_depth = prism_data:CalculateMinimumBevelDepth(tool, true) | -- ProfileParameterData.PROFILE_ON | ||
if min_bevel_depth > cut_depth then | profile_data.ProfileSide = ProfileParameterData.PROFILE_OUTSIDE | ||
DisplayMessageBox("A prism will not be fully formed with a depth of " .. cut_depth .. "\r\n" .. | -- Allowance to leave on when machining | ||
"A depth of " .. min_bevel_depth .. " is required to fully form the prism" | profile_data.Allowance = 0.0 | ||
-- true to preserve start point positions, false to reorder start | |||
end -- if end | -- points to minimise toolpath length | ||
-- Create object which can be used to automatically select geometry | profile_data.KeepStartPoints = false | ||
local geometry_selector = GeometrySelector() | -- true if want to create 'square' external corners on toolpath | ||
-- if this is true we create 2d toolpaths previews in 2d view, if false we dont | profile_data.CreateSquareCorners = false | ||
local create_2d_previews = true | -- true to perform corner sharpening on internal corners (only with v-bits) | ||
-- if this is true we will display errors and warning to the user | profile_data.CornerSharpen = false | ||
local display_warnings = true | -- true to use tabs (position of tabs must already have been defined on vectors) | ||
-- Create our toolpath | profile_data.UseTabs = false | ||
local toolpath_manager = ToolpathManager() | -- length for tabs if being used | ||
local toolpath_id = toolpath_manager:CreatePrismCarvingToolpath(name, tool, prism_data, pos_data, geometry_selector, create_2d_previews, display_warnings) | profile_data.TabLength = 5.0 | ||
if toolpath_id == nil then | -- Thickness for tabs if being used | ||
profile_data.TabThickness = 1.0 | |||
-- if true then create 3d tabs else 2d tabs | |||
profile_data.Use3dTabs = true | |||
-- if true in Aspire, project toolpath onto composite model | |||
profile_data.ProjectToolpath = false | |||
-- Create object used to control ramping | |||
local ramping_data = RampingData() | |||
-- if true we do ramping into toolpath | |||
ramping_data.DoRamping = false | |||
-- type of ramping to perform RampingData.RAMP_LINEAR , RampingData.RAMP_ZIG_ZAG | |||
-- or RampingData.RAMP_SPIRAL | |||
ramping_data.RampType = RampingData.RAMP_ZIG_ZAG | |||
-- how ramp is contrained - either by angle or distance RampingData.CONSTRAIN_DISTANCE | |||
-- or RampingData.CONSTRAIN_ANGLE | |||
ramping_data.RampConstraint = RampingData.CONSTRAIN_ANGLE | |||
-- if we are constraining ramp by distance, distance to ramp over | |||
ramping_data.RampDistance = 100.0 | |||
-- if we are contraining ramp by angle , angle to ramp in at (in degrees) | |||
ramping_data.RampAngle = 25.0 | |||
-- if we are contraining ramp by angle, max distance to travel before 'zig zaging' | |||
-- if zig zaging | |||
ramping_data.RampMaxAngleDist = 15 | |||
-- if true we restrict our ramping to lead in section of toolpath | |||
ramping_data.RampOnLeadIn = false | |||
-- Create object used to control lead in/out | |||
local lead_in_out_data = LeadInOutData() | |||
-- if true we create lead ins on profiles (not for profile on) | |||
lead_in_out_data.DoLeadIn = false | |||
-- if true we create lead outs on profiles (not for profile on) | |||
lead_in_out_data.DoLeadOut = false | |||
-- type of leads to create LeadInOutData.LINEAR_LEAD or LeadInOutData.CIRCULAR_LEAD | |||
lead_in_out_data.LeadType = LeadInOutData.CIRCULAR_LEAD | |||
-- length of lead to create | |||
lead_in_out_data.LeadLength = 10.0 | |||
-- Angle for linear leads | |||
lead_in_out_data.LinearLeadAngle = 45 | |||
-- Radius for circular arc leads | |||
lead_in_out_data.CirularLeadRadius = 5.0 | |||
-- distance to 'overcut' (travel past start point) when profiling | |||
lead_in_out_data.OvercutDistance = 0.0 | |||
-- Create object which can be used to automatically select geometry | |||
local geometry_selector = GeometrySelector() | |||
-- if this is true we create 2d toolpaths previews in 2d view, if false we dont | |||
local create_2d_previews = true | |||
-- if this is true we will display errors and warning to the user | |||
local display_warnings = true | |||
-- Create our toolpath | |||
local toolpath_manager = ToolpathManager() | |||
local toolpath_id = toolpath_manager:CreateProfilingToolpath(name, tool, profile_data, ramping_data, lead_in_out_data, pos_data, geometry_selector, create_2d_previews, display_warnings ) | |||
if toolpath_id == nil then | |||
DisplayMessageBox("Error creating toolpath") | |||
return false | |||
end | |||
return true | |||
end -- end function</nowiki> | |||
---- | |||
===CreatePocketingToolpath=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function CreatePocketingToolpath(name, start_depth, cut_depth, tool_dia, tool_stepdown, tool_stepover_percent, tool_in_mm) | |||
-- Create tool we will use to machine vectors | |||
local tool = Tool("Lua End Mill",Tool.END_MILL) -- BALL_NOSE, END_MILL, VBIT | |||
tool.InMM = tool_in_mm | |||
tool.ToolDia = tool_dia | |||
tool.Stepdown = tool_stepdown | |||
tool.Stepover = tool_dia * (tool_stepover_percent / 100) | |||
tool.RateUnits = Tool.MM_SEC -- MM_SEC, MM_MIN, METRES_MIN, INCHES_SEC,... | |||
tool.FeedRate = 30 | |||
tool.PlungeRate = 10 | |||
tool.SpindleSpeed = 20000 | |||
tool.ToolNumber = 1 | |||
tool.VBit_Angle = 90.0 -- used for vbit only | |||
tool.ClearStepover = tool_dia * (tool_stepover_percent / 100) -- used for vbit only | |||
-- Create object used to set home position and safez gap above material surface | |||
local pos_data = ToolpathPosData() | |||
pos_data:SetHomePosition(0, 0, 1.0) | |||
pos_data.SafeZGap = 5.0 | |||
-- Create object used to pass pocketing options | |||
local pocket_data = PocketParameterData() | |||
-- start depth for toolpath | |||
pocket_data.StartDepth = start_depth | |||
-- cut depth for toolpath this is depth below start depth | |||
pocket_data.CutDepth = cut_depth | |||
-- direction of cut for offet clearance - ProfileParameterData.CLIMB_DIRECTION or | |||
-- ProfileParameterData.CONVENTIONAL_DIRECTION - NOTE: enum from ProfileParameterData | |||
pocket_data.CutDirection = ProfileParameterData.CLIMB_DIRECTION | |||
-- Allowance to leave on when machining | |||
pocket_data.Allowance = 0.0 | |||
-- if true use raster clearance strategy , else use offset area clearance | |||
pocket_data.DoRasterClearance = true | |||
-- angle for raster if using raster clearance | |||
pocket_data.RasterAngle = 0 | |||
-- type of profile pass to perform PocketParameterData.PROFILE_NONE , | |||
-- PocketParameterData.PROFILE_FIRST orPocketParameterData.PROFILE_LAST | |||
pocket_data.ProfilePassType = PocketParameterData.PROFILE_LAST | |||
-- if true we ramp into pockets (always zig-zag) | |||
pocket_data.DoRamping = false | |||
-- if ramping, distance to ramp over | |||
pocket_data.RampDistance = 10.0 | |||
-- if true in Aspire, project toolpath onto composite model | |||
pocket_data.ProjectToolpath = false | |||
-- Create object which can be used to automatically select geometry | |||
local geometry_selector = GeometrySelector() | |||
-- if this is true we create 2d toolpaths previews in 2d view, if false we dont | |||
local create_2d_previews = true | |||
-- if this is true we will display errors and warning to the user | |||
local display_warnings = true | |||
-- if we are doing two tool pocketing define tool to use for area clearance | |||
local area_clear_tool = nill | |||
-- we just create a tool twice as large for testing here | |||
area_clear_tool = Tool("Lua Clearance End Mill", Tool.END_MILL) -- BALL_NOSE, END_MILL, VBIT | |||
area_clear_tool.InMM = tool_in_mm | |||
area_clear_tool.ToolDia = tool_dia * 2 | |||
area_clear_tool.Stepdown = tool_stepdown * 2 | |||
area_clear_tool.Stepover = tool_dia * 2 *(tool_stepover_percent / 100) | |||
area_clear_tool.RateUnits = Tool.MM_SEC -- MM_SEC, MM_MIN, METRES_MIN, INCHES_SEC.. | |||
area_clear_tool.FeedRate = 30 | |||
area_clear_tool.PlungeRate = 10 | |||
area_clear_tool.SpindleSpeed = 20000 | |||
area_clear_tool.ToolNumber = 1 | |||
area_clear_tool.VBit_Angle = 90.0 -- used for vbit only | |||
area_clear_tool.ClearStepover = tool_dia*2*(tool_stepover_percent/100) -- used for vbit | |||
-- Create our toolpath | |||
local toolpath_manager = ToolpathManager() | |||
local toolpath_id = toolpath_manager:CreatePocketingToolpath(name,tool,area_clear_tool,pocket_data,pos_data,geometry_selector,create_2d_previews,display_warnings) | |||
if toolpath_id == nill then | |||
DisplayMessageBox("Error creating toolpath") | |||
return false | |||
end | |||
return true | |||
end -- end function</nowiki> | |||
---- | |||
===CreateDrillingToolpath=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function CreateDrillingToolpath(name, start_depth, cut_depth, retract_gap, tool_dia, tool_stepdown, tool_in_mm) | |||
-- Create tool we will use to machine vectors | |||
local tool = Tool("Lua Drill", Tool.THROUGH_DRILL) -- BALL_NOSE, END_MILL, VBIT, THROUGH_DRILL | |||
tool.InMM = tool_in_mm | |||
tool.ToolDia = tool_dia | |||
tool.Stepdown = tool_stepdown | |||
tool.Stepover = tool_dia * 0.25 | |||
tool.RateUnits = Tool.MM_SEC -- MM_SEC, MM_MIN, METRES_MIN, INCHES_SEC, INCHES_MIN, FEET_MIN | |||
tool.FeedRate = 30 | |||
tool.PlungeRate = 10 | |||
tool.SpindleSpeed = 20000 | |||
tool.ToolNumber = 1 | |||
tool.VBit_Angle = 90.0 -- used for vbit only | |||
tool.ClearStepover = tool_dia * 0.5 -- used for vbit only | |||
-- Create object used to set home position and safez gap above material surface | |||
local pos_data = ToolpathPosData() | |||
pos_data:SetHomePosition(0, 0, 1.0) | |||
pos_data.SafeZGap = 5.0 | |||
-- Create object used to pass profile options | |||
local drill_data = DrillParameterData() | |||
-- start depth for toolpath | |||
drill_data.StartDepth = start_depth | |||
-- cut depth for toolpath this is depth below start depth | |||
drill_data.CutDepth = cut_depth | |||
-- if true perform peck drilling | |||
drill_data.DoPeckDrill = retract_gap > 0.0 | |||
-- distance to retract above surface when peck drilling | |||
drill_data.PeckRetractGap = retract_gap | |||
-- if true in Aspire, project toolpath onto composite model | |||
drill_data.ProjectToolpath = false | |||
-- Create object which can be used to automatically select geometry | |||
local geometry_selector = GeometrySelector() | |||
-- if this is true we create 2d toolpaths previews in 2d view, | |||
-- if false we dont | |||
local create_2d_previews = true | |||
-- if this is true we will display errors and warning to the user | |||
local display_warnings = true | |||
-- Create our toolpath | |||
local toolpath_manager = ToolpathManager() | |||
local toolpath_id = toolpath_manager:CreateDrillingToolpath(name,tool,drill_data,pos_data,geometry_selector,create_2d_previews,display_warnings) | |||
if toolpath_id == nil then | |||
DisplayMessageBox("Error creating toolpath") | |||
return false | |||
end | |||
return true | |||
end -- end function</nowiki> | |||
---- | |||
===CreateVCarvingToolpath=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function CreateVCarvingToolpath(name, start_depth, flat_depth, vbit_angle, vbit_dia, vbit_stepdown, tool_stepover_percent, tool_in_mm) | |||
--[[ -------------- CreateVCarvingToolpath -------------- | |||
| | |||
| Create a VCarving toolpath within the program for the currently selected vectors | |||
| Parameters: | |||
| name, -- Name for toolpath | |||
| start_depth -- Start depth for toolpath below surface of material | |||
| flat_depth -- flat depth - if 0.0 assume not doing flat bottom | |||
| vbit_angle -- angle of vbit to use | |||
| vbit_dia -- diameter of VBit to use | |||
| vbit_stepdown -- stepdown for tool | |||
| tool_stepover_percent - percentage stepover for tool | |||
| tool_in_mm -- true if tool size and stepdown are in mm | |||
| | |||
| Return Values: | |||
| true if toolpath created OK else false | |||
| | |||
]] | |||
-- Create tool we will use to machine vectors | |||
local tool = Tool("Lua VBit",Tool.VBIT )-- BALL_NOSE, END_MILL, VBIT | |||
tool.InMM = tool_in_mm | |||
tool.ToolDia = vbit_dia | |||
tool.Stepdown = vbit_stepdown | |||
tool.Stepover = vbit_dia * (tool_stepover_percent / 100) | |||
tool.RateUnits = Tool.MM_SEC -- MM_SEC, MM_MIN, METRES_MIN, INCHES_SEC, INCHES_MIN, FEET_MIN | |||
tool.FeedRate = 30 | |||
tool.PlungeRate = 10 | |||
tool.SpindleSpeed = 20000 | |||
tool.ToolNumber = 1 | |||
tool.VBit_Angle = 90.0 -- used for vbit only | |||
tool.ClearStepover = vbit_dia * (tool_stepover_percent / 100) * 2 -- used for vbit only | |||
-- Create object used to set home position and safez gap above material surface | |||
local pos_data = ToolpathPosData() | |||
vcarve_data:SetHomePosition(Milling.HomeX, Milling.HomeY, Milling.HomeZGap ) -- vcarve_data:SetHomePosition(0, 0, 1.0) | |||
vcarve_data.SafeZGap = Milling.SafeZGap -- vcarve_data.SafeZGap = 0.5 | |||
local vcarve_data = VCarveParameterData() -- Create object used to pass pocketing options - used for area clearance only | |||
vcarve_data.StartDepth = start_depth -- start depth for toolpath | |||
vcarve_data.DoFlatBottom = flat_depth > 0.0 -- flag indicating if we are creating a flat bottomed toolpath | |||
vcarve_data.FlatDepth = flat_depth -- cut depth for toolpath this is depth below start depth | |||
vcarve_data.ProjectToolpath = false -- if true in Aspire, project toolpath onto composite model | |||
vcarve_data.UseAreaClearTool = true -- set flag indicating we are using flat tool | |||
local pocket_data = PocketParameterData() -- Create object used to pass pocketing options - used for area clearance only | |||
pocket_data.StartDepth = start_depth -- start depth for toolpath | |||
pocket_data.CutDepth = flat_depth -- cut depth for toolpath this is depth below start depth | |||
pocket_data.CutDirection = ProfileParameterData.CLIMB_DIRECTION -- direction of cut for offet clearance - ProfileParameterData.CLIMB_DIRECTION or ProfileParameterData.CONVENTIONAL_DIRECTION - NOTE: enum from ProfileParameterData | |||
-- if true use raster clearance strategy , else use offset area clearance | |||
pocket_data.DoRasterClearance = false | |||
-- set flag indicating we are using flat tool | |||
pocket_data.UseAreaClearTool = true | |||
-- angle for raster if using raster clearance | |||
pocket_data.RasterAngle = 0 | |||
-- type of profile pass to perform PocketParameterData.PROFILE_NONE , | |||
-- PocketParameterData.PROFILE_FIRST orPocketParameterData.PROFILE_LAST | |||
pocket_data.ProfilePassType = PocketParameterData.PROFILE_LAST | |||
-- if this is true we create 2d toolpaths previews in 2d view, if false we dont | |||
local create_2d_previews = true | |||
-- if this is true we will display errors and warning to the user | |||
local display_warnings = true | |||
-- if we are doing two tool pocketing define tool to use for area clearance | |||
local area_clear_tool = nil | |||
-- we just create a 10mm end mill | |||
area_clear_tool = Tool("Lua Clearance End Mill",Tool.END_MILL) -- BALL_NOSE, END_MILL, VBIT | |||
area_clear_tool.InMM = true | |||
area_clear_tool.ToolDia = 10 | |||
area_clear_tool.Stepdown = 3 | |||
area_clear_tool.Stepover = 3 | |||
area_clear_tool.RateUnits = Tool.MM_SEC -- MM_SEC, MM_MIN, METRES_MIN, INCHES_SEC, INCHES_MIN, FEET_MIN | |||
area_clear_tool.FeedRate = 30 | |||
area_clear_tool.PlungeRate = 10 | |||
area_clear_tool.SpindleSpeed = 20000 | |||
area_clear_tool.ToolNumber = 2 | |||
local geometry_selector = GeometrySelector() -- Create object which can be used to automatically select geometry | |||
-- Create our toolpath | |||
local toolpath_manager = ToolpathManager() | |||
local toolpath_id = toolpath_manager:CreateVCarvingToolpath(name,tool, area_clear_tool,vcarve_data, pocket_data,pos_data,geometry_selector, create_2d_previews,display_warnings) | |||
if toolpath_id == nil then | |||
DisplayMessageBox("Error creating toolpath") | |||
return false | |||
end | |||
return true | |||
end -- end function</nowiki> | |||
---- | |||
===CreatePrismToolpath=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function CreatePrismToolpath(name, start_depth, cut_depth, vbit_angle, vbit_dia, vbit_stepdown, tool_stepover_percent, tool_in_mm) | |||
--[[ ------------------- CreatePrismToolpath ------------------- | |||
| | |||
| Create a prism toolpath within the program for the currently selected vectors | |||
| Parameters: | |||
| name, -- Name for toolpath | |||
| start_depth -- Start depth for toolpath below surface of material | |||
| cut_depth -- cut depth for drilling toolpath | |||
| vbit_angle -- angle of vbit to use | |||
| vbit_dia -- diameter of VBit to use | |||
| vbit_stepdown -- stepdown for tool | |||
| tool_stepover_percent - percentage stepover for tool | |||
| tool_in_mm -- true if tool size and stepdown are in mm | |||
| | |||
| Return Values: | |||
| true if toolpath created OK else false | |||
| | |||
]] | |||
-- Create tool we will use to machine vectors | |||
local tool = Tool("Lua VBit", Tool.VBIT ) -- BALL_NOSE, END_MILL, VBIT | |||
tool.InMM = tool_in_mm | |||
tool.ToolDia = vbit_dia | |||
tool.Stepdown = vbit_stepdown | |||
tool.Stepover = vbit_dia * (tool_stepover_percent / 100) | |||
tool.RateUnits = Tool.MM_SEC -- MM_SEC, MM_MIN, METRES_MIN, INCHES_SEC, INCHES_MIN, FEET_MIN | |||
tool.FeedRate = 30 | |||
tool.PlungeRate = 10 | |||
tool.SpindleSpeed = 20000 | |||
tool.ToolNumber = 1 | |||
tool.VBit_Angle = 90.0 -- used for vbit only | |||
tool.ClearStepover = vbit_dia * (tool_stepover_percent / 100) * 2 -- used for vbit only | |||
-- Create object used to set home position and safez gap above material surface | |||
local pos_data = ToolpathPosData() | |||
pos_data:SetHomePosition(0, 0, 1.0) | |||
pos_data.SafeZGap = 5.0 | |||
-- Create object used to pass profile options | |||
local prism_data = PrismCarveParameterData() | |||
-- start depth for toolpath | |||
prism_data.StartDepth = start_depth | |||
-- cut depth for toolpath this is depth below start depth | |||
prism_data.CutDepth = cut_depth | |||
-- direction of cut for offet clearance - ProfileParameterData.CLIMB_DIRECTION | |||
-- or ProfileParameterData.CONVENTIONAL_DIRECTION - NOTE: enum from ProfileParameterData | |||
prism_data.CutDirection = ProfileParameterData.CLIMB_DIRECTION | |||
-- calculate the minimum cut depth to fully form the bevel on the current | |||
-- selection with the current tool | |||
local min_bevel_depth = prism_data:CalculateMinimumBevelDepth(tool, true) | |||
if min_bevel_depth > cut_depth then | |||
DisplayMessageBox("A prism will not be fully formed with a depth of " .. cut_depth .. "\r\n" .. | |||
"A depth of " .. min_bevel_depth .. " is required to fully form the prism") | |||
end -- if end | |||
-- Create object which can be used to automatically select geometry | |||
local geometry_selector = GeometrySelector() | |||
-- if this is true we create 2d toolpaths previews in 2d view, if false we dont | |||
local create_2d_previews = true | |||
-- if this is true we will display errors and warning to the user | |||
local display_warnings = true | |||
-- Create our toolpath | |||
local toolpath_manager = ToolpathManager() | |||
local toolpath_id = toolpath_manager:CreatePrismCarvingToolpath(name, tool, prism_data, pos_data, geometry_selector, create_2d_previews, display_warnings) | |||
if toolpath_id == nil then | |||
DisplayMessageBox("Error creating toolpath") | |||
return false | |||
end -- if end | |||
return true | |||
end -- end function</nowiki> | |||
---- | |||
===CreateFlutingToolpath=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function CreateFlutingToolpath(name, start_depth, cut_depth, tool_dia, tool_stepdown, tool_in_mm) | |||
--[[ ----------------- CreateFlutingToolpath ----------------- | |||
| Create a flutting toolpath within the program for the currently selected vectors | |||
| Parameters: | |||
| name, -- Name for toolpath | |||
| start_depth -- Start depth for toolpath below surface of material | |||
| cut_depth -- cut depth for toolpath | |||
| tool_dia -- diameter of tool to use | |||
| tool_stepdown -- stepdown for tool | |||
| tool_in_mm -- true if tool size and stepdown are in mm | |||
| | |||
| Return Values: | |||
| true if toolpath created OK else false | |||
| | |||
]] | |||
-- Create tool we will use to machine vectors | |||
local tool = Tool("Lua Ball Nose", Tool.BALL_NOSE) -- BALL_NOSE, END_MILL, VBIT, THROUGH_DRILL | |||
tool.InMM = tool_in_mm | |||
tool.ToolDia = tool_dia | |||
tool.Stepdown = tool_stepdown | |||
tool.Stepover = tool_dia * 0.25 | |||
tool.RateUnits = Tool.MM_SEC -- MM_SEC, MM_MIN, METRES_MIN, INCHES_SEC, INCHES_MIN, FEET_MIN | |||
tool.FeedRate = 30 | |||
tool.PlungeRate = 10 | |||
tool.SpindleSpeed = 20000 | |||
tool.ToolNumber = 1 | |||
tool.VBit_Angle = 90.0 -- used for vbit only | |||
tool.ClearStepover = tool_dia * 0.5 -- used for vbit only | |||
-- Create object used to set home position and safez gap above material surface | |||
local pos_data = ToolpathPosData() | |||
pos_data:SetHomePosition(0, 0, 1.0) | |||
pos_data.SafeZGap = 5.0 | |||
-- Create object used to pass fluting options | |||
local fluting_data = FlutingParameterData() | |||
-- start depth for toolpath | |||
fluting_data.StartDepth = start_depth | |||
-- cut depth for toolpath this is depth below start depth | |||
fluting_data.CutDepth = cut_depth | |||
-- type of fluting FULL_LENGTH, RAMP_START or RAMP_START_END | |||
fluting_data.FluteType = FlutingParameterData.RAMP_START_END | |||
-- type of ramping RAMP_LINEAR, RAMP_SMOOTH | |||
fluting_data.RampType = FlutingParameterData.RAMP_LINEAR | |||
-- if true use ratio field for controling ramp length else absolute length value | |||
fluting_data.UseRampRatio = false | |||
-- length of ramp as ratio of flute length(range 0 - 1.0) | |||
-- (for start and end - ratio is of half length) | |||
fluting_data.RampRatio = 0.2 | |||
-- length to ramp over - if UseRampRatio == false | |||
fluting_data.RampLength = 15 | |||
-- if true in Aspire, project toolpath onto composite model | |||
fluting_data.ProjectToolpath = false | |||
-- Create object which can be used to automatically select geometry | |||
local geometry_selector = GeometrySelector() | |||
-- if this is true we create 2d toolpaths previews in 2d view, if false we dont | |||
local create_2d_previews = true | |||
-- if this is true we will display errors and warning to the user | |||
local display_warnings = true | |||
-- Create our toolpath | |||
local toolpath_manager = ToolpathManager() | |||
local toolpath_id = toolpath_manager:CreateFlutingToolpath(name, tool, fluting_data, pos_data, geometry_selector, create_2d_previews, display_warnings) | |||
if toolpath_id == nil then | |||
DisplayMessageBox("Error creating toolpath") | DisplayMessageBox("Error creating toolpath") | ||
return false | return false | ||
else | |||
return true | |||
end | end | ||
end -- end function</nowiki> | |||
-- | |||
---- | |||
===SelectVectorsOnLayer=== | |||
[[File:TopOfPage.png|right|50px|link=JimAndi Toolbox]] | |||
<nowiki>function SelectVectorsOnLayer(layer, selection, select_closed, select_open, select_groups) | |||
-- Please Note: SelectVectorsOnLayer is provided by Vectric and can be found in the SDK and Sample Gadget files. | -- Please Note: SelectVectorsOnLayer is provided by Vectric and can be found in the SDK and Sample Gadget files. | ||
--[[ ---------------- SelectVectorsOnLayer ---------------- | --[[ ---------------- SelectVectorsOnLayer ---------------- | ||
Line 6,055: | Line 6,746: | ||
return objects_selected | return objects_selected | ||
end -- function end | end -- function end | ||
</nowiki> | |||
[[Category:SDK]] | |||
[[ | |||
==References== | ==References== | ||
'''Please Note:''' The base material for the contents found in this WiKi was sourced from Vectric Lua Interface for Gadgets, version 10.0, published August 21, 2019. by Vectric Ltd. Most current document from Vertric can be downloaded at [https://gadgets.vectric.com/developerinfo.html Vertric Developer Information] | '''Please Note:''' The base material for the contents found in this WiKi was sourced from Vectric Lua Interface for Gadgets, version 10.0, published August 21, 2019. by Vectric Ltd. Most current document from Vertric can be downloaded at [https://gadgets.vectric.com/developerinfo.html Vertric Developer Information] | ||
Latest revision as of 17:58, 1 May 2024
Table and Array Tools
This object is a name-value pair that represents a Document Variable within a VectricJob.
ArrayClear
ArrayClear - Clears the data from a data array.
local tbl = {1, 2, 5, 6}
tbl = ArrayClear(tbl)
returns tbl = {}
function ArrayClear(arrayName) for _,v in ipairs(arrayName) do table.remove(arrayName, i) end -- for end return true end -- function end
NameCheck
Checks if Name is in the list of it is default name.
a = {1, 2, 5, 6}
Words = NameCheck(a, 5) -- returns true
function NameCheck(Name, Defalt, ListName) if Name ~= Defalt then for i=1, ListName do if Name == i then return true end end return false else return true end end -- function end
RemoveDuplicates
Returns table of unique items in "A" acending or "D" decending
local tbl = {1, 2, 5, 3, 5, 6, 4}
tbl = ArrayClear(tbl, "A")
returns tbl = {1, 2, 3, 4, 5, 6} function RemoveDuplicates(tab, order) local hashSet = {} local new = {} local value for i = 1, #tab do value = (tab[i]) if hashSet[value] == nil then table.insert(new, value) hashSet[value] = true end end if string.upper(order) =="A" then table.sort(new) else table.sort(new, function(a, b) return a > b end) end return new end -- function end
RemoveTableItem
Returns table with item removed.
local tbl = {1, 2, 3, 4, 5, 6}
tbl = RemoveTableItem(tbl, 4)
returns tbl = {1, 2, 3, 5, 6}
function RemoveTableItem(tabName, tabItem) for x = 1 in ipairs(tabName) do if tabName[x] == tabItem then table.remove(tabName, i) end end -- for end return true end -- function end
TableLength
Returns table item count local tbl = {1, 2, 3, 4, 5, 6} tbl = TableLength(tbl) returns tbl = 6 -- =====================================================]] function TableLength(tbl) -- tbl = {7, 6, 5, 4, 3, 2, 1} local count = 0 for _ in pairs(tbl) do count = count + 1 end return count end -- function end
FindDups
Find all duplicate items and returns two tables the dup and clean tables
Returns table item count
local tbl = {1, 2, 2, 4, 4, 6}
local tbl1 = {}
local tbl2 = {}
tbl1, tbl2 = TableLength(tbl)
returns tbl1, tbl2 = 6
function FindDups(checktbl, duptbl, cleantbl) function tLength(tbl) -- tLength returns table count local count = 0 for _ in pairs(tbl) do count = count + 1 end return count end -- ================================= local trip = false for i=1, tLength(checktbl) do for x=1, tLength(cleantbl) do if cleantbl[x] == checktbl[i] then trip = true end end if trip then table.insert(duptbl, checktbl[i]) else table.insert(cleantbl, checktbl[i]) end trip = false end return table.sort(duptbl), table.sort(cleantbl) end -- function end
ReverseTable
Returns a reversed table
local tbl = {1, 2, 3, 4, 5, 6}
tbl = ReverseTable(tbl)
returns tbl = {6, 5, 4, 3, 2, 1}
function ReverseTable(tbl) --tbl = {7, 6, 7, A, 5, 4, 3, A, 2, 1} local n = #tbl local i = 1 while i < n do tbl[i],tbl[n] = tbl[n],tbl[i] i = i + 1 n = n - 1 end return tbl end -- function end
Conversion Tools
This collection of functions that assist in the conversion activities.
Bool2Str
bool2Str - Converts true or false as a string. local x = true tbl = bool2Str(x) -- =====================================================]] returns "true" function Bool2Str(x) if x then return "true" else return "false" end end --function end
D2S8
D2S8 - Converts a Number (Double) to a String with 8 places function D2S8(d) -- Converts a Number (Double) to a String with 8 places -- local x =12.2351 -- returns "12.23510000" -- =====================================================]] return string.format("%.8f", d) end -- end function
D2S4
D2S4 - Converts a Number (Double) to a String with 4 places local x =12.23 = D2S4(x) returns x = "12.2300" -- =====================================================]] function D2S4(d) return string.format("%.4f", d) end -- end function
Toint
Toint - Converts a Double Number to a intiger local x = 12.23 = toint(x) returns x = 12 function toint(number) return math.floor(tonumber(number) or error("Could not cast '" .. tostring(number) .. "' to number.'")) end -- end function
Rounder
return tonumber(string.format("%." .. (idp or 0) .. "f", n -- =====================================================]] function Rounder(num, idp) -- Rounds a Number (Double) up or down return tonumber(string.format("%." .. (idp or 0) .. "f", num)) end -- end function
RUsame
-- =====================================================]] function RUsame(num, comp) -- Rounds a Number (Double) up or down local function toint(number) return math.floor(tonumber(number) or error("Could not cast '" .. tostring(number) .. "' to number.'")) end local function Rounder(num, idp) -- Rounds a Number (Double) up or down return tonumber(string.format("%." .. (idp or 0) .. "f", num)) end -- end function num = math.abs(num) local idp = #comp local Mynum = Rounder(num, idp) local Myint = toint(Mynum) local Myval = tonumber(tostring(Myint) .. "." .. comp) if (Mynum == Myval) then return true else return false end -- if end end -- end function
WithIn
Retuns true if number is within tolerance with match
function WithIn(Num, Mat, Tol) if ((Num >= (Mat - Tol)) and (Num <= (Mat + Tol))) then return true end -- if end return false end -- end function
Double2Fraction
Converts a Measurement (Double) to a Fractional String
local txt = Double2Fraction(1.25)
returns txt ="1-1/4"
function Double2Fraction(Num) local Frac = "Error" if Num then Frac = tostring(Num) end if (not Milling.Unit) and Num then local AmountValuex = math.floor(math.abs(Num)) local DicValue = Num - AmountValuex local AmountValue = tostring(AmountValuex) Frac = tostring(DicValue) if Project.Fractions == "No Fractions" then Frac = tostring(Num) elseif Project.Fractions == "1/8" then if DicValue >= 0.9375 then AmountValue = tostring(AmountValuex + 1) Frac = "0" elseif DicValue >= 0.8125 then Frac = "7/8" .. string.char(34) elseif DicValue >= 0.6875 then Frac = "3/4" .. string.char(34) elseif DicValue >= 0.5625 then Frac = "5/8" .. string.char(34) elseif DicValue >= 0.4375 then Frac = "1/2" .. string.char(34) elseif DicValue >= 0.3125 then Frac = "3/8" .. string.char(34) elseif DicValue >= 0.1875 then Frac = "1/4" .. string.char(34) elseif DicValue >= 0.0625 then Frac = "1/8" .. string.char(34) else Frac = "0" end elseif Project.Fractions == "1/16" then if DicValue >= 0.96875 then AmountValue = tostring(AmountValuex + 1) Frac = "0" elseif DicValue >= 0.90625 then Frac = "15/16" .. string.char(34) elseif DicValue >= 0.84375 then Frac = "7/8" .. string.char(34) elseif DicValue >= 0.78125 then Frac = "13/16" .. string.char(34) elseif DicValue >= 0.71875 then Frac = "3/4" .. string.char(34) elseif DicValue >= 0.65625 then Frac = "11/16" .. string.char(34) elseif DicValue >= 0.59375 then Frac = "5/8" .. string.char(34) elseif DicValue >= 0.53125 then Frac = "9/16" .. string.char(34) elseif DicValue >= 0.46875 then Frac = "1/2" .. string.char(34) elseif DicValue >= 0.40625 then Frac = "7/16" .. string.char(34) elseif DicValue >= 0.34375 then Frac = "3/8" .. string.char(34) elseif DicValue >= 0.28125 then Frac = "5/16" .. string.char(34) elseif DicValue >= 0.21875 then Frac = "1/4" .. string.char(34) elseif DicValue >= 0.15625 then Frac = "3/16" .. string.char(34) elseif DicValue >= 0.09375 then Frac = "1/8" .. string.char(34) elseif DicValue >= 0.03125 then Frac = "1/16" .. string.char(34) else Frac = "0" end -- If end elseif Project.Fractions == "1/32" then if DicValue >= 0.984375 then AmountValue = tostring(AmountValuex + 1) Frac = "0" elseif DicValue >= 0.953126 then Frac = "31/32" .. string.char(34) elseif DicValue >= 0.921876 then Frac = "15/16" .. string.char(34) elseif DicValue >= 0.890626 then Frac = "29/32" .. string.char(34) elseif DicValue >= 0.859376 then Frac = "7/8" .. string.char(34) elseif DicValue >= 0.828126 then Frac = "27/32" .. string.char(34) elseif DicValue >= 0.796876 then Frac = "13/16" .. string.char(34) elseif DicValue >= 0.765626 then Frac = "25/32" .. string.char(34) elseif DicValue >= 0.737376 then Frac = "3/4" .. string.char(34) elseif DicValue >= 0.703126 then Frac = "23/32" .. string.char(34) elseif DicValue >= 0.671876 then Frac = "11/16" .. string.char(34) elseif DicValue >= 0.640626 then Frac = "21/32" .. string.char(34) elseif DicValue >= 0.609376 then Frac = "5/8" .. string.char(34) elseif DicValue >= 0.578126 then Frac = "19/32" .. string.char(34) elseif DicValue >= 0.541260 then Frac = "9/16" .. string.char(34) elseif DicValue >= 0.515626 then Frac = "17/32" .. string.char(34) elseif DicValue >= 0.484376 then Frac = "1/2" .. string.char(34) elseif DicValue >= 0.468760 then Frac = "15/32" .. string.char(34) elseif DicValue >= 0.421876 then Frac = "7/16" .. string.char(34) elseif DicValue >= 0.390626 then Frac = "13/32" .. string.char(34) elseif DicValue >= 0.359376 then Frac = "3/8" .. string.char(34) elseif DicValue >= 0.328126 then Frac = "11/32" .. string.char(34) elseif DicValue >= 0.296876 then Frac = "5/16" .. string.char(34) elseif DicValue >= 0.265626 then Frac = "9/32" .. string.char(34) elseif DicValue >= 0.234376 then Frac = "1/4" .. string.char(34) elseif DicValue >= 0.203126 then Frac = "7/32" .. string.char(34) elseif DicValue >= 0.171876 then Frac = "3/16" .. string.char(34) elseif DicValue >= 0.140626 then Frac = "5/32" .. string.char(34) elseif DicValue >= 0.109376 then Frac = "1/8" .. string.char(34) elseif DicValue >= 0.078126 then Frac = "3/32" .. string.char(34) elseif DicValue >= 0.046876 then Frac = "1/16" .. string.char(34) elseif DicValue >= 0.015626 then Frac = "1/32" .. string.char(34) else Frac = "0" end -- If end elseif Project.Fractions == "1/64" then if DicValue >= 0.9921875 then AmountValue = tostring(AmountValuex + 1) Frac = "0" elseif DicValue >= 0.9765625 then Frac = "62/64" .. string.char(34) elseif DicValue >= 0.9609375 then Frac = "31/32" .. string.char(34) elseif DicValue >= 0.9453125 then Frac = "61/64" .. string.char(34) elseif DicValue >= 0.9296875 then Frac = "15/16" .. string.char(34) elseif DicValue >= 0.9140625 then Frac = "59/64" .. string.char(34) elseif DicValue >= 0.8984375 then Frac = "29/32" .. string.char(34) elseif DicValue >= 0.8828125 then Frac = "57/64" .. string.char(34) elseif DicValue >= 0.8671875 then Frac = "7/8" .. string.char(34) elseif DicValue >= 0.8515625 then Frac = "55/64" .. string.char(34) elseif DicValue >= 0.8359375 then Frac = "27/32" .. string.char(34) elseif DicValue >= 0.8203125 then Frac = "53/64" .. string.char(34) elseif DicValue >= 0.8046875 then Frac = "13/16" .. string.char(34) elseif DicValue >= 0.7890625 then Frac = "51/64" .. string.char(34) elseif DicValue >= 0.7734375 then Frac = "25/32" .. string.char(34) elseif DicValue >= 0.7578125 then Frac = "49/64" .. string.char(34) elseif DicValue >= 0.7421875 then Frac = "3/4" .. string.char(34) elseif DicValue >= 0.7265625 then Frac = "47/64" .. string.char(34) elseif DicValue >= 0.7109375 then Frac = "23/32" .. string.char(34) elseif DicValue >= 0.6953125 then Frac = "45/64" .. string.char(34) elseif DicValue >= 0.6796875 then Frac = "11/16" .. string.char(34) elseif DicValue >= 0.6640625 then Frac = "43/64" .. string.char(34) elseif DicValue >= 0.6484375 then Frac = "21/32" .. string.char(34) elseif DicValue >= 0.6328125 then Frac = "41/64" .. string.char(34) elseif DicValue >= 0.6171875 then Frac = "5/8" .. string.char(34) elseif DicValue >= 0.6015625 then Frac = "39/64" .. string.char(34) elseif DicValue >= 0.5859375 then Frac = "19/32" .. string.char(34) elseif DicValue >= 0.5703125 then Frac = "37/64" .. string.char(34) elseif DicValue >= 0.5546875 then Frac = "9/16" .. string.char(34) elseif DicValue >= 0.5390625 then Frac = "35/64" .. string.char(34) elseif DicValue >= 0.5234375 then Frac = "17/32" .. string.char(34) elseif DicValue >= 0.5078125 then Frac = "33/64" .. string.char(34) elseif DicValue >= 0.4921875 then Frac = "1/2" .. string.char(34) elseif DicValue >= 0.4765625 then Frac = "31/64" .. string.char(34) elseif DicValue >= 0.4609375 then Frac = "15/32" .. string.char(34) elseif DicValue >= 0.4453125 then Frac = "29/32" .. string.char(34) elseif DicValue >= 0.4296875 then Frac = "7/16" .. string.char(34) elseif DicValue >= 0.4140625 then Frac = "27/64" .. string.char(34) elseif DicValue >= 0.3984375 then Frac = "13/32" .. string.char(34) elseif DicValue >= 0.3828125 then Frac = "25/64" .. string.char(34) elseif DicValue >= 0.3671875 then Frac = "3/8" .. string.char(34) elseif DicValue >= 0.3515625 then Frac = "23/64" .. string.char(34) elseif DicValue >= 0.3359375 then Frac = "11/32" .. string.char(34) elseif DicValue >= 0.3203125 then Frac = "21/64" .. string.char(34) elseif DicValue >= 0.3046875 then Frac = "5/16" .. string.char(34) elseif DicValue >= 0.2890625 then Frac = "19/64" .. string.char(34) elseif DicValue >= 0.2734375 then Frac = "9/32" .. string.char(34) elseif DicValue >= 0.2578125 then Frac = "17/64" .. string.char(34) elseif DicValue >= 0.2421875 then Frac = "1/4" .. string.char(34) elseif DicValue >= 0.2265625 then Frac = "15/64" .. string.char(34) elseif DicValue >= 0.2109375 then Frac = "7/32" .. string.char(34) elseif DicValue >= 0.1953125 then Frac = "13/64" .. string.char(34) elseif DicValue >= 0.1796875 then Frac = "3/16" .. string.char(34) elseif DicValue >= 0.1640625 then Frac = "11/64" .. string.char(34) elseif DicValue >= 0.1484375 then Frac = "5/32" .. string.char(34) elseif DicValue >= 0.1328125 then Frac = "9/64" .. string.char(34) elseif DicValue >= 0.1171875 then Frac = "1/8" .. string.char(34) elseif DicValue >= 0.1015625 then Frac = "7/64" .. string.char(34) elseif DicValue >= 0.0859375 then Frac = "3/32" .. string.char(34) elseif DicValue >= 0.0703125 then Frac = "5/64" .. string.char(34) elseif DicValue >= 0.0546875 then Frac = "1/16" .. string.char(34) elseif DicValue >= 0.0390625 then Frac = "3/64" .. string.char(34) elseif DicValue >= 0.0234375 then Frac = "1/32" .. string.char(34) elseif DicValue >= 0.0078125 then Frac = "1/64" .. string.char(34) else Frac = "0" end -- If end end if Project.Fractions == "No Fractions" then Frac = tostring(Num) else if Frac == "0" then Frac = AmountValue .. string.char(34) else if AmountValue ~= "0" then Frac = AmountValue .. "-" .. Frac end end end end return Frac end -- end function
Time and Date Tools
This collection of functions are utilized in the date and time calculations.
StartDateTime
StartDateTime - Returns the Date and Time.
local dt= StartDateTime(true)
returns tbl = "10/02/23"
function StartDateTime(LongShort) --[[ Date Value Codes -- | %a abbreviated weekday name (e.g., Wed) -- | %A full weekday name (e.g., Wednesday) -- | %b abbreviated month name (e.g., Sep) -- | %B full month name (e.g., September) -- | %c date and time (e.g., 09/16/98 23:48:10) -- | %d day of the month (16) [01-31] -- | %H hour, using a 24-hour clock (23) [00-23] -- | %I hour, using a 12-hour clock (11) [01-12] -- | %M minute (48) [00-59] -- | %m month (09) [01-12] -- | %p either "am" or "pm" (pm) -- | %S second (10) [00-60] -- | %w weekday (3) [0-6 = Sunday-Saturday] -- | %x date (e.g., 09/16/98) -- | %X time (e.g., 23:48:10) -- | %Y full year (e.g., 1998) -- | %y two-digit year (98) [00-99] -- | %% the character `%´ ]] if LongShort then return os.date("%b %d, %Y") .. " - " .. os.date("%I") .. ":" .. os.date("%m") .. os.date("%p") else return os.date("%Y%m%d%H%M") end end
StartDate
StartDate - Returns the Date and Time.
local dt= StartDate(true)
returns tbl = "10/02/23"
function StartDate(LongShort) --[[ Date Value Codes -- | %a abbreviated weekday name (e.g., Wed) -- | %A full weekday name (e.g., Wednesday) -- | %b abbreviated month name (e.g., Sep) -- | %B full month name (e.g., September) -- | %c date and time (e.g., 09/16/98 23:48:10) -- | %d day of the month (16) [01-31] -- | %H hour, using a 24-hour clock (23) [00-23] -- | %I hour, using a 12-hour clock (11) [01-12] -- | %M minute (48) [00-59] -- | %m month (09) [01-12] -- | %p either "am" or "pm" (pm) -- | %S second (10) [00-60] -- | %w weekday (3) [0-6 = Sunday-Saturday] -- | %x date (e.g., 09/16/98) -- | %X time (e.g., 23:48:10) -- | %Y full year (e.g., 1998) -- | %y two-digit year (98) [00-99] -- | %% the character `%´ ]] if LongShort then return os.date("%b %d, %Y") -- "Sep 01, 2022" else return os.date("%Y%m%d") -- "20220901" end end
Wait
Wait - Waits for a duration.
local dt = Wait(true)
returns tbl = "10/02/23"
function Wait(time) local duration = os.time() + time while os.time() < duration do end end end -- function end
Debugging Tools
This collection of functions assist in the debugging of code.
DMark - places a circle and notation to assist in geometry debugging
Draws a circle and marks on the drawing for debugging purposes.
call = DebugMarkPoint("Note: Hi", Pt1)
function DMark(Note, Pt) -- ==== Sub Function local function DrawCircle(job, Cpt, CircleRadius, LayerName) -- Draws a circle local pa = Polar2D(Cpt, 180.0, CircleRadius) local pb = Polar2D(Cpt, 0.0, CircleRadius) local line = Contour(0.0) line:AppendPoint(pa); line:ArcTo(pb,1); line:ArcTo(pa,1) local layer = job.LayerManager:GetLayerWithName(LayerName) layer:AddObject(CreateCadContour(line), true) return true end -- function end -- ==== local BubbleSize = 1.25 if not Project.DebugAngle then Project.DebugAngle = 0.0 end Project.DebugAngle = Project.DebugAngle + 2.0 if Project.DebugAngle >= 90.0 and Project.DebugAngle <= 358.0 then Project.DebugAngle = 272.0 elseif Project.DebugAngle >= 360.0 then Project.DebugAngle = 2.0 end if Pt then local job = VectricJob() local Pt1 = Polar2D(Pt, Project.DebugAngle, BubbleSize) local Pt2 = Polar2D(Pt1, 0.0, BubbleSize * 0.25) local Pt3 = Polar2D(Pt2, 315.0, BubbleSize * 0.0883883476483188 * 4.0) local line = Contour(0.0) local layer = job.LayerManager:GetLayerWithName("Debug") line:AppendPoint(Pt) line:LineTo(Pt1) line:LineTo(Pt2) layer:AddObject(CreateCadContour(line), true) DrawWriter(Note, Pt3, BubbleSize * 0.5, "Debug", 0.0) DrawCircle(job, Pt, BubbleSize * 0.5, "Debug") else DisplayMessageBox("Issue with Point for - " .. Note) end return true end -- function end
StatusMessage
Useage: (Type of Message, Dialog Header, Question or Message, Err No.)
StatusMessage("Error", "Base Cabinet Settings", "Face Frame Bottom Rail Width - value cannot be 0.", "(9000)")
Note: if the debug flag is on (true) a message box shows the message length, dialog size and error number
function StatusMessage(Type, Header, Question, ErrorNumber) local dialog local X = 460 local Y = 124 local step = 35 Question = WrapString(Question, step) local QL = string.len(Question) if (QL > step) and (QL < step * 2) then Y = Y + 12 elseif (QL > (step * 2) +1) and (QL < 105) then Y = Y + 24 elseif (QL > (step * 3) +1) and (QL < (step * 4)) then Y = Y + 36 elseif (QL > (step * 4) +1) and (QL < (step * 5)) then Y = Y + 48 elseif (QL > (step * 5) +1) and (QL < (step * 6)) then Y = Y + 60 elseif (QL > (step * 6) +1) and (QL < (step * 7)) then Y = Y + 72 elseif (QL > (step * 7) +1) and (QL < (step * 8)) then Y = Y + 84 elseif (QL > (step * 8) +1) and (QL < (step * 9)) then Y = Y + 96 elseif (QL > (step * 9) +1) and (QL < (step * 10)) then Y = Y + 108 elseif (QL > (step * 10) +1) and (QL < (step * 11)) then Y = Y + 120 else Y = Y + 150 end if Project.Debugger then Queston = Question .. " - " .. ErrorNumber end if Type == "Alert" then dialog = HTML_Dialog(true, DialogWindow.myHtml16, X, Y, Header) else -- "Error" dialog = HTML_Dialog(true, DialogWindow.myHtml17, X, Y, Header) end -- if end if Project.Debugger then Question = Question .. " " .. ErrorNumber end dialog:AddLabelField("Question", Type .. ": " .. Question) dialog:ShowDialog() if Project.Debugger then DisplayMessageBox("Question Len " .. " = " .. tostring(string.len(Question)) .. ": \nWindow = " .. tostring(dialog.WindowWidth) .. " x " .. tostring(dialog.WindowHeight)) end return true end
DebugMarkPoint
Used in debugging drawing issues - Draws a Circle and Text at the provided point(x,y)
call = DebugMarkPoint("Note: Hi", Pt1, 0.125, "Jim")
function DebugMarkPoint(Note, Pt, Size, LayerName) if Size == nil then Size = 0.125 end if LayerName == nil then LayerName = "Debug" end -- ==== Sub Function local function DrawCircle(job, Cpt, CircleRadius, LayerName) -- Draws a circle local pa = Polar2D(Cpt, 180.0, CircleRadius) local pb = Polar2D(Cpt, 0.0, CircleRadius) local line = Contour(0.0) line:AppendPoint(pa); line:ArcTo(pb,1); line:ArcTo(pa,1) local layer = job.LayerManager:GetLayerWithName(LayerName) layer:AddObject(CreateCadContour(line), true) return true end -- sub function end -- ==== local job = VectricJob() local Pt1 = Polar2D(Pt, Project.DebugAngle, Size * 2.0) local Pt2 = Polar2D(Pt1, 0.0, 0.500 * Size) local Pt3 = Polar2D(Pt2, 315.0, (0.500 * Size) * 1.4142135623731) local line = Contour(0.0) local layer = job.LayerManager:GetLayerWithName(LayerName) line:AppendPoint(Pt) line:LineTo(Pt1) line:LineTo(Pt2) layer:AddObject(CreateCadContour(line), true) DrawWriter(Note, Pt3, Size, LayerName, 0.0) DrawCircle(job, Pt, Size, LayerName) return true end -- function end
ShowDialogSize
Returns Dialog size in a message box showing the X and Y vaalues.
function ShowDialogSize() DisplayMessageBox(tostring(dialog.WindowWidth) .. " x " .. tostring(dialog.WindowHeight)) end -- function end
Dialog and Menu Tools
This object is a name-value pair that represents a Document.
DialogSize
Returns Dialog size in a message box showing the X and Y vaalues.
function DialogSize(Str) -- Returns the X and Y value of the dialogue local InText = string.find(string.upper(Str) , "X") local DialogX = All_Trim(string.sub(Str, 1, InText - 1)) local DialogY = All_Trim(string.sub(Str, InText + 1)) return tonumber(DialogX), tonumber(DialogY) end -- function end
ProgressBarAmount
Returns Dialog size in a message box showing the X and Y vaalues.
function ProgressBarAmount(TotalRecords, Record) -- Calculates the percent amount of progression based on total process --[[ local MyProgressBar MyProgressBar = ProgressBar("Working", ProgressBar.LINEAR) -- Setup Type of progress bar MyProgressBar:SetPercentProgress(0) -- Sets progress bar to zero MyProgressBar:SetPercentProgress(ProgressAmount(Door.Records, myRecord)) -- sends percent of process progress bar (adds to the bar) MyProgressBar:SetPercentProgress(ProgressAmount(12000, 416)) -- sends percent of process progress bar (adds to the bar) MyProgressBar:SetText("Compete") -- Sets the label to Complete MyProgressBar:Finished() -- Close Progress Bar ]] local X1 = (100.0 / TotalRecords) local X2 = X1 * Record local X3 = math.abs(X2) local X4 = (math.floor(X3)) return (math.floor(math.abs((100.0 / TotalRecords) * Record))) end -- function end
OnLuaButton_InquiryGearCalulate
Returns Dialog size in a message box showing the X and Y vaalues.
function OnLuaButton_InquiryGearCalulate(dialog) Gear.Addendum = dialog:GetDoubleField("Gear.Addendum") Gear.Dedendum = dialog:GetDoubleField("Gear.Dedendum") Gear.AddendumDiameter = dialog:GetDoubleField("Gear.AddendumDiameter") Gear.DedendumDiameter = dialog:GetDoubleField("Gear.DedendumDiameter") Gear.ToothTickness = dialog:GetDoubleField("Gear.ToothTickness") Gear.Slotwidth = dialog:GetDoubleField("Gear.Slotwidth") Gear.PitchAmount = dialog:GetDoubleField("Gear.PitchAmount") Gear.FilletRadius = dialog:GetDoubleField("Gear.FilletRadius") Gear.ToplandAmount = dialog:GetDoubleField("Gear.ToplandAmount") Gear.FaceFlankRadius = dialog:GetDoubleField("Gear.FaceFlankRadius") Gear.ToothCount = dialog:GetDropDownListValue("Gear.ToothCount") Gear.ShowLines = dialog:GetDropDownListValue("Gear.ShowLines") dialog:UpdateDoubleField("Gear.Addendum", Gear.Addendum) dialog:UpdateDoubleField("Gear.Dedendum", Gear.Dedendum) dialog:UpdateDoubleField("Gear.AddendumDiameter", Gear.AddendumDiameter) dialog:UpdateDoubleField("Gear.DedendumDiameter", Gear.DedendumDiameter) dialog:UpdateDoubleField("Gear.ToothTickness", Gear.ToothTickness) dialog:UpdateDoubleField("Gear.Slotwidth", Gear.Slotwidth) dialog:UpdateDoubleField("Gear.PitchAmount", Gear.PitchAmount) dialog:UpdateDoubleField("Gear.FilletRadius", Gear.FilletRadius) dialog:UpdateDoubleField("Gear.ToplandAmount", Gear.ToplandAmount) dialog:UpdateDoubleField("Gear.FaceFlankRadius", Gear.FaceFlankRadius) return true end -- function end
InquiryDropList
Returns Dialog size in a message box showing the X and Y vaalues.
function InquiryDropList(Header, Quest, DX, DY, DList) --[[ Drop list foe user input Caller: local y = InquiryDropList("Cabinet Maker", "Select Cabinet Style", 290, 165, IniFile) Dialog Header = "Cabinet Maker" Quest = "Select Cabinet Style" Selection Array = IniFile Returns = String ]] local myHtml = [[<!DOCTYPE HTML><html lang="en"><head><title>My List Box</title><style>.FormButton{font-weight:700;width:75px;font-size:12px;white-space:nowrap;font-family:Arial,Helvetica,sans-serif font-size: 12px}.h1-l{font-size:12px;font-weight:700;text-align:left;white-space:nowrap}.h1-c{font-size:12px;font-weight:700;text-align:center;white-space:nowrap}table{width:100%;border:0}body,td,th{background-color:#3a4660;background-position:center;overflow:hidden;font-family:arial,helvetica,sans-serif;font-size:12px;color:#fff;background-image:url(']].. DialogWindow.myBackGround ..[[')}html{overflow:hidden}</style></head><body><table><tr><td class="h1-l" id="Questions"><strong class="h2">Message Here</strong></td></tr><tr><td class="h1-c"><select name="DList" size="10" class="h1-c" id="ListBox"><option>My Default 1</option><option selected="selected">My Default 2</option><option>My Default 3</option><option>My Default 4</option></select></td></tr><tr><th class="h1-l" colspan="3" id="QuestionID"></th></tr></table><table><tr><td class="h1-c"><input id="ButtonCancel" class="FormButton" name="ButtonCancel" type="button" value="Cancel"></td><td></td><td class="h1-c"><input id="ButtonOK" class="FormButton" name="ButtonOK" type="button" value="OK"></td></tr></table></body></html>]] ; local dialog = HTML_Dialog(true, myHtml, DX, DY, Header) dialog:AddLabelField("Questions", Quest) dialog:AddDropDownList("ListBox", "DEFAULT") dialog:AddDropDownListValue("ListBox", "DEFAULT") for index, value in pairs(DList) do dialog:AddDropDownListValue("ListBox", value) end if not dialog:ShowDialog() then return "." else return dialog:GetDropDownListValue("ListBox") end end -- function end
InquiryFileBox
Returns Dialog size in a message box showing the X and Y vaalues.
function InquiryFileBox(Header, Quest, DefaltPath) --[[ Dialog Box for user to pick a file Caller: local X = InquiryFileBox("Select File", "Where is the file location?", "C:\\") Dialog Header = "File Name" User Question = "Path name?" Default Value = "C:\\" Returns = String ]] local myHtml = [[<html> <head> <title>Easy Tools</title> <style type = "text/css"> html {overflow: hidden; } body { background-color: #EBEBEB; overflow:hidden; font-family: Arial, Helvetica, sans-serif; font-size: 12px; } body, td, th {font-family: Arial, Helvetica, sans-serif ; font-size: 12px ; color: #000 ; } .FormButton {font-weight: bold ; width: 100% ; font-family: Arial, Helvetica, sans-serif ; font-size: 12px ; } body { background-color: #EBEBEB; } </style> </head> <body bgcolor = "#EBEBEB" text = "#000000"> <table width = "470" border = "0" cellpadding = "0"> <tr> <th align = "left" valign = "top" bgcolor = "#EBEBEB" id = "QuestionID"><strong>Message Here</strong></th> <th align = "left" valign = "middle" bgcolor = "#EBEBEB"> </th> </tr> <tr> <th width = "381" align = "right" valign = "middle" bgcolor = "#EBEBEB" id = "QuestionID"> <input name = "ReadFile" type = "text" id = "ReadFile" size = "60"></th> <th width = "83" align = "center" valign = "middle" bgcolor = "#EBEBEB"> <span style="width: 15%"> <input id = "FilePicker" class = "FilePicker" name = "FilePicker" type = "button" value = "Path"> </span></th> </tr> <tr> <td colspan = "2" align = "center" valign = "middle" bgcolor = "#EBEBEB"> <table border = "0" width = "100%"> <tr align = "right"> <td style = "width: 20%"> </td> <td style = "width: 20%"></td> <td style = "width: 25%"></td> <td style = "width: 15%"> <input id = "ButtonCancel" class = "FormButton" name = "ButtonCancel" type = "button" value = "Cancel"> </td> <td style = "width: 15%"> <input id = "ButtonOK" class = "FormButton" name = "ButtonOK" type = "button" value = "OK"> </td> </tr> </table> </td> </tr> </table> </body> </html>]] -- ============================================= local dialog = HTML_Dialog(true, myHtml, 505, 150, Header) dialog:AddLabelField("QuestionID", Quest) dialog:AddTextField("ReadFile", DefaltPath ) dialog:AddFilePicker(true, "FilePickerButton", "ReadFile", true) if not dialog:ShowDialog() then return "" else return dialog:GetTextField("ReadFile") end -- if end end -- function end
InquiryPathBox
Returns Dialog size in a message box showing the X and Y vaalues.
function InquiryPathBox(Header, Quest, DefaltPath) --[[ Number Box for user input with default value Caller: local X = InquiryPathBox("Select Path", "Where is the file location?", "C:\\") Dialog Header = "Tool Name" User Question = "Path name?" Default Value = "C:\\" Returns = String ]] local myHtml = [[ <html> <head> <title>Easy Tools</title> <style type = "text/css"> html {overflow: hidden; } body { background-color: #EBEBEB; overflow:hidden; font-family: Arial, Helvetica, sans-serif; font-size: 12px; } body, td, th {font-family: Arial, Helvetica, sans-serif ; font-size: 12px ; color: #000 ; } .FormButton {font-weight: bold ; width: 100% ; font-family: Arial, Helvetica, sans-serif ; font-size: 12px ; } body { background-color: #EBEBEB; } </style> </head> <body bgcolor = "#EBEBEB" text = "#000000"> <table width = "470" border = "0" cellpadding = "0"> <tr> <th align = "left" valign = "top" bgcolor = "#EBEBEB" id = "QuestionID"><strong>Message Here</strong></th> <th align = "left" valign = "middle" bgcolor = "#EBEBEB"> </th> </tr> <tr> <th width = "381" align = "right" valign = "middle" bgcolor = "#EBEBEB" id = "QuestionID"> <input name = "DInput" type = "text" id = "DInput" size = "60"></th> <th width = "83" align = "center" valign = "middle" bgcolor = "#EBEBEB"> <span style="width: 15%"> <input id = "DirectoryPicker" class = "DirectoryPicker" name = "DirectoryPicker" type = "button" value = "Path"> </span></th> </tr> <tr> <td colspan = "2" align = "center" valign = "middle" bgcolor = "#EBEBEB"> <table border = "0" width = "100%"> <tr align = "right"> <td style = "width: 20%"> </td> <td style = "width: 20%"></td> <td style = "width: 25%"></td> <td style = "width: 15%"> <input id = "ButtonCancel" class = "FormButton" name = "ButtonCancel" type = "button" value = "Cancel"> </td> <td style = "width: 15%"> <input id = "ButtonOK" class = "FormButton" name = "ButtonOK" type = "button" value = "OK"> </td> </tr> </table> </td> </tr> </table> </body> </html>]] -- ============================================= local dialog = HTML_Dialog(true, myHtml, 505, 150, Header) dialog:AddLabelField("QuestionID", Quest) dialog:AddTextField("DInput", DefaltPath ) dialog:AddDirectoryPicker("DirectoryPicker", "DInput", true) if not dialog:ShowDialog() then return "" else return dialog:GetTextField("DInput") end -- if end end -- function end
InquiryAreYouSureYesNo
Returns Dialog size in a message box showing the X and Y vaalues.
function InquiryAreYouSureYesNo(Header, Question1, Question2) --[[ Drop list for user to input project info Caller = local y = InquiryAreYouSureYesNo("Pie Question", "Do you want free pie") Dialog Header = "Pie Question" User Question1 = "Do you want a Free Pie" User Question2 = "You only get one" Returns = true / false ]] local myHtml = [[ <html><head><title>Yes or No Question</title>]] .. DialogWindow.Style ..[[</head><body><table><tr><td colspan="3" class="h2-lw" id="Question1">Question1</td></tr><tr><td colspan="3" class="h2-lw" id="Question2">Question2</td></tr><tr><td class="h2-l"> </td></tr><tr><td colspan="3" class="h2-l">Are you sure?</td></tr><tr><td class="h2-l"> </td></tr></table><table><tr><td colspan="3"><h2><span></span></h2></td></tr> <tr><td class="h1-l"><input id="ButtonOK" class="FormButton FormBut" name="ButtonOK" type="button" value=" Yes "> </td> <td class="h1-r"> <input id="ButtonCancel" class="FormButton FormBut" name="ButtonCancel" type="button" value=" No "></td></tr></table></body></html>]] -- ========================================================= local dialog = HTML_Dialog(true, myHtml, 440, 218, Header) dialog:AddLabelField("Question1", Question1) dialog:AddLabelField("Question2", Question2) if not dialog:ShowDialog() then return false else return true end end -- function end
InquiryDoubleBox
Returns Dialog size in a message box showing the X and Y vaalues.
function InquiryDoubleBox(Header, Quest, DefaltN) --[[ -- nquiryNumberBox for user input with default number value -- Caller: local x = InquiryNumberBox("Cabinet Maker", "Enter the cabinet height", 30.0) -- Dialog Header: "Cabinet Maker" -- User Question: "Enter the cabinet height" -- Default value = 30.0 -- Returns = double ]] local myHtml = [[<html><head><title>Get Double Value</title><style type="text/css">html{overflow:hidden}body{background-color:#ebebeb;overflow:hidden;font-family:Arial,Helvetica,sans-serif;font-size:12px;text:#000}.h1-l{font-family:Arial,Helvetica,sans-serif;font-size:12px;font-weight:700;text-align:left;white-space:nowrap}.h1-r{font-family:Arial,Helvetica,sans-serif;font-size:12px;font-weight:700;text-align:right;white-space:nowrap}.h1-c{font-family:Arial,Helvetica,sans-serif;font-size:12px;font-weight:700;text-align:center;white-space:nowrap}table{width:100%;border:0;cellpadding:0}.FilePicker{font-weight:700;font-family:Arial,Helvetica,sans-serif;font-size:12px;width:50px}.FormButton{font-weight:700;width:65px;font-family:Arial,Helvetica,sans-serif;font-size:12px}</style></head><body><table><tr><td id="QuestionID" class="h1-r"><strong>Message Here</strong></td><td><input type="text" id="NumberInput" size="5"></td></tr><tr><td colspan="2"></td></tr></table><table><tr class="h1-c"><td><input id="ButtonCancel" class="FormButton" name="ButtonCancel" type="button" value="Cancel"></td><td><input id="ButtonOK" class="FormButton" name="ButtonOK" type="button" value="OK"></td></tr></table></body></html>]] local dialog = HTML_Dialog(true, myHtml, 260, 125, Header) dialog:AddLabelField("QuestionID", Quest) ; dialog:AddDoubleField("NumberInput", DefaltN) ; if not dialog:ShowDialog() then return -1 else return dialog:GetDoubleField("NumberInput") end end -- function end
InquiryIntegerBox
Returns Dialog size in a message box showing the X and Y vaalues.
function InquiryIntegerBox(Header, Quest, DefaltI) --[[ -- InquiryIntegerBox for user input with default number value -- Caller: local x = InquiryIntegerBox("Cabinet Maker", "Enter the door count", 4) -- Dialog Header: "Cabinet Maker" -- User Question: "Enter the door count" -- Default value = 4 -- Returns = integer ]] local myHtml = [[<html><head><title>Get Integer</title><style type="text/css">html{overflow:auto}body{background-color:#ebebeb}table{width:100%;border:0}body,td,th{font-family:Arial,Helvetica,sans-serif;font-size:12px;color:#000}.FormButton{font-weight:700;width:85px;font-family:Arial,Helvetica,sans-serif;font-size:12px}body{background-color:#ebebeb;text:#000}</style></head><body><table><tr><td id="QuestionID"><strong>Message Here</strong></td><td><input type="text" id="IntegerInput" size="10"></td></tr><tr><td colspan="2"></td></tr></table><table><tr><td><input id="ButtonCancel" class="FormButton" name="ButtonCancel" type="button" value="Cancel"></td><td><input id="ButtonOK" class="FormButton" name="ButtonOK" type="button" value="OK"></td></tr></table></body></html>]] local dialog = HTML_Dialog(true, myHtml, 505, 140, Header) dialog:AddLabelField("QuestionID", Quest) dialog:AddIntegerField("IntegerInput", DefaltI) if not dialog:ShowDialog() then return -1 else return dialog:GetIntegerField("IntegerInput") end end -- function end
InquiryTextgBox
Returns Dialog size in a message box showing the X and Y vaalues.
function InquiryTextgBox(Header, Quest, DefaltS) --[[ -- InquiryStringBox for user input with default number value -- Caller: local x = InquiryTextgBox("Cabinet Maker", "Enter the cabinet Name", "Jim") -- Dialog Header: "Cabinet Maker" -- User Question: "Enter the cabinet Name" -- Default value = Jim -- Returns = string ]] local myHtml = [[<html><head><title>Get Number</title><style type="text/css">html{overflow:auto}body{background-color:#ebebeb}table{width:100%;border:0}body,td,th{font-family:Arial,Helvetica,sans-serif;font-size:12px;color:#000}.FormButton{font-weight:700;width:85px;font-family:Arial,Helvetica,sans-serif;font-size:12px}body{background-color:#ebebeb;text:#000}</style></head><body><table><tr><td id="QuestionID"><strong>Message Here</strong></td><td><input type="text" id="StringInput" size="10"></td></tr><tr><td colspan="2"></td></tr></table><table><tr><td><input id="ButtonCancel" class="FormButton" name="ButtonCancel" type="button" value="Cancel"></td><td><input id="ButtonOK" class="FormButton" name="ButtonOK" type="button" value="OK"></td></tr></table></body></html>]] local dialog = HTML_Dialog(true, myHtml, 505, 140, Header) dialog:AddLabelField("QuestionID", Quest) dialog:AddTextField("StringInput", DefaltS) if not dialog:ShowDialog() then return -1 else return dialog:GetTextField("NumberInput") end end -- function end
OnLuaButton_InquiryError
Returns Dialog size in a message box showing the X and Y vaalues.
function OnLuaButton_InquiryError(Message) --[[ Provides user information on an Error Caller = local ItWorked = OnLuaButton_InquiryError("No number found") Dialog Header = "Something Error" User Message = "No Number etc..." Returns = True ]] local myHtml = [[<html><head><title>Error</title><style type = "text/css">.FormButton{font-weight:bold;width:75px;font-family:Arial,Helvetica,sans-serif;font-size:12px;white-space:nowrap}.Error{font-family:Arial,Helvetica,sans-serif;font-size:18px;font-weight:bold;color:#F00;text-align:left;white-space:nowrap;padding-right:4px;padding-left:10px;padding-top:4px;padding-bottom:4px}.ErrorMessage{font-family:Arial,Helvetica,sans-serif;font-size:12px;color:#000;font-weight:bold;text-align:left;white-space:nowrap;padding-right:4px;padding-left:10px;padding-top:4px;padding-bottom:4px}.ErrorTable{background-color:#FFF white-space:nowrap}html{overflow:hidden}</style></head><body text = "#000000"><table width="100%" border="0" cellpadding="0" class="ErrorTable"><tr><th align="center" nowrap="nowrap" class="Error">Error!</th></tr><tr><td id="ErrorMessage"><label class="ErrorMessage">-</label></tr><tr><td width="30%" align="right" style = "width: 15%"><input id = "ButtonOK" class = "FormButton" name = "ButtonOK" type = "button" value = "Exit"></td></tr></table></body></html>]] local dialogWide = (#Message + 300) local dialog = HTML_Dialog(true, myHtml, 250, dialogWide, "Gadget Error") dialog:AddLabelField("ErrorMessage", Message) dialog:ShowDialog() Dovetail.InquiryErrorX = Dialog.WindowWidth Dovetail.InquiryErrorY = Dialog.WindowHeight WriteRegistry() return true end -- function end
PresentMessage
Returns Dialog size in a message box showing the X and Y vaalues.
function PresentMessage(Header, Type, Line) --[[ Provides user information on an Error Caller = local ItWorked = OnLuaButton_InquiryError("No number found") Dialog Header = "Something Error" User Message = "No Number etc..." Returns = True ]] local myHtml = [[<html><head><title>Error</title>]] .. DialogWindow.Style ..[[</head><body> <table><tr><th valign="top" id="MessageType" class="Error">-</th><td id="MessageLine"><label class="ErrorMessage">-</label><td></tr> <tr><td></td><td align="right"><input id = "ButtonOK" class = "FormButton" name = "ButtonOK" type = "button" value = "OK"></td></tr> </table></body></html>]] local dialog = HTML_Dialog(true, myHtml, 500, 150, Header) dialog:AddLabelField("MessageType", Type .. ": ") dialog:AddLabelField("MessageLine", Line) dialog:ShowDialog() return true end -- function end
OnLuaButton_InquiryAbout
Returns Dialog size in a message box showing the X and Y vaalues.
function OnLuaButton_InquiryAbout() local myHtml = [[<html><head><title>About</title>]] .. DialogWindow.Style ..[[</head><body text = "#000000"><table width="680" border="0" cellpadding="0"> <tr> <td align="center" nowrap="nowrap" class="header1-c" id="SysName">Easy Cabinet Maker</td> </tr> <tr> <td align="center" nowrap="nowrap" id="Version" class="ver-c">Version</td> </tr> <tr> <td align="center" nowrap="nowrap"><hr></td> </tr> <tr> <td align="center" nowrap="nowrap" class="header2-c">Disclaimer</td> </tr> <tr> <td align="center" class="p1-l"><p class="p1-l">The ]] .. Dovetail.AppName .. [[ Gadget is a plugin for Vectric software, V-Carve Pro and Aspire.<br> Gadgets are an entirely optional add-in to Vectric's core software products.<br> They are provided 'as-is', without any express or implied warranty, and you make use of them entirely at your own risk.<br> In no event will the author(s) or Vectric Ltd. be held liable for any damages arising from their use.<br> <br> Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:<br> 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software.<br> * If you use this software in a product, an acknowledgement in the product documentation would be appreciated but is not required.<br> 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.<br> 3. This notice may not be removed or altered from any source distribution.<br> <br>The author heavily utilized the SDK documentation and supplied code samples in addition to the outstanding user community on the Vectric User forum.</p></td> </tr> <tr> <td align="center"><a href="https://forum.vectric.com" class="webLink-c">Vectric User Forum</a></td> </tr> <tr> <td align="center"><span class="header2-c">JimAndi</span></td> </tr> <tr> <td align="center"><span class="h1-c">Houston, TX.</span></td> </tr> <tr> <td><hr></td> </tr> <tr> <td width="30%" align="center" style = "width: 15%"><input id = "ButtonOK" class = "FormButton" name = "ButtonOK" type = "button" value = "OK"></td> </tr></table></body></html>]] local dialog = HTML_Dialog(true, myHtml, 720, 468, "About") dialog:AddLabelField("SysName", Project.ProgramName) dialog:AddLabelField("Version", "Version: " .. Project.ProgramVersion) dialog:ShowDialog() Project.AboutXY = tostring(dialog.WindowWidth) .. " x " .. tostring(dialog.WindowHeight) return true end -- function end
Color_HTML
Returns Dialog size in a message box showing the X and Y vaalues.
function Color_HTML () MessageBox(" X = " .. tostring(dialog.WindowWidth) .. " Y = " .. tostring(dialog.WindowHeight) ) -- =====================================================]] --[[ -- begin HTML for Layer Color <table> <tr> <td width="200" align="right" valign="middle" nowrap class="h1-rp">Layer Name</td> <td width="300" align="right" valign="middle" nowrap class="h1-l" id="ValueTable"> <input name="Panel.PinHole" type="text" class="h1-l" id="Panel.PinHole" size="50" maxlength="50"/> </td> <td width="150"align="right" valign="middle" nowrap class="h1-l"><label for="Panel.LineColor01">Color</label> <select name="Panel.LineColor01" id="Panel.LineColor01"> <option selected="selected">Black</option> <option>Blue</option> <option>Brown</option> <option>Cyan</option> <option>Gray</option> <option>Green</option> <option>Lime</option> <option>Magenta</option> <option>Maroon</option> <option>Navy</option> <option>Olive</option> <option>Orange</option> <option>Purple</option> <option>Red</option> <option>Silver</option> <option>Teal</option> <option>White</option> <option>Yellow</option> </select></td> </tr> </table> <table width="101%" border="0" id="ButtonTable"> </table> ]] -- end HTML end -- function end
Style
Returns Dialog size in a message box showing the X and Y vaalues.
function Style() -- =====================================================]] DialogWindow.Style = [[ <style> .DirectoryPicker { font-weight: bold; font-size: 12px; white-space: nowrap; background-color: #663300; color: #FFFFFF; } .FormButton { font-weight: bold; width: 75px; font-size: 12px; white-space: nowrap; background-color: #663300; color: #FFFFFF; } .FormButton-Help { font-weight: bold; width: 75px; font-size: 12px; white-space: nowrap; background-color: #663300; color: #FFFFFF; padding-left: 10; padding-right: 10; } .LuaButton { font-weight: bold; font-size: 12px; background-color: #663300; color: #FFFFFF; } .ToolNameLabel { font-weight: bolder; font-size: 12px; text-align: left; color: #000; width: 70%; } .ToolPicker { font-weight: bold; text-align: center; font-size: 12px; text-align: center; width: 50px; background-color: #663300; color: #FFFFFF; } .alert-c { font-size: 14px; font-weight: bold; text-align: center; white-space: nowrap; } .alert-l { font-size: 14px; font-weight: bold; text-shadow: 5px 5px 10px #FFF; text-align: left; width: 100%; white-space: nowrap; } .alert-r { font-size: 14px; font-weight: bold; text-align: right; white-space: nowrap; } .error { font-size: 18px; font-weight: bold; color: #FF0000; text-align: left; white-space: nowrap; padding-right: 4px; padding-left: 10px; padding-top: 4px; padding-bottom: 4px; } .errorMessage { font-size: 12px; color: #000; font-weight: bold; text-align: left; white-space: nowrap; padding-right: 4px; padding-left: 10px; padding-top: 4px; padding-bottom: 4px; } .errorTable { background-color: #FFFFFF; white-space: nowrap; } .p1-l { font-size: 12px; text-align: left; } .h1-c { font-size: 12px; font-weight: bold; text-align: center; white-space: nowrap; } .h1-cOk { font-size: 12px; font-weight: bold; text-align: center; white-space: nowrap; width: 15%; } .h1-l { font-size: 12px; font-weight: bold; text-align: left; white-space: nowrap; } .h1-r { font-size: 12px; font-weight: bold; text-align: right; white-space: nowrap; } .h1-rP { font-size: 12px; font-weight: bold; text-align: right; white-space: nowrap; padding-right: 4px; padding-left: 4px; } .h1-rPx { font-size: 12px; font-weight: bold; text-align: right; white-space: nowrap; padding-right: 8px; padding-left: 8px; } .h2-c { font-size: 14px; font-weight: bold; text-align: center; white-space: nowrap; text-shadow: 2px 2px white; } .h2-l { font-size: 14px; font-weight: bold; color: #663300; text-align: left; white-space: nowrap; text-shadow: 2px 2px white; } .h2-r { font-size: 14px; font-weight: bold; color: #663300; text-align: right; white-space: nowrap; text-shadow: 2px 2px white; } .h3-bc { font-size: 16px; font-weight: bold; text-align: center; white-space: nowrap; } .h3-c { font-size: 16px; font-weight: bold; text-align: center; white-space: nowrap; } .h3-l { font-size: 16px; font-weight: bold; text-align: left; white-space: nowrap; } .h3-r { font-size: 16px; font-weight: bold; text-align: right; white-space: nowrap; } .h4-c { font-size: 18px; font-weight: bold; text-align: center; white-space: nowrap; } .h4-l { font-size: 18px; font-weight: bold; text-align: left; white-space: nowrap; } .h4-r { font-size: 18px; font-weight: bold; text-align: right; white-space: nowrap; } .help_But { width: 45px; } .MyCenter{ text-align:center; width:10; } .MyLeft{ text-align:left; width:10; } .MyRight{ text-align:right; width:10; } .helplabel-r { cursor: pointer; white-space: nowrap; text-align: right; } .helplabel-rp { cursor: pointer; white-space: nowrap; text-align: right; padding-right: 8px; } .jsTag-no-vis { font-size: 10px; display: none; text-align: center; color: #00F; visibility: hidden; } .jsbutton { background-color: #663300; border: 2px solid #999; border-right-color: #000; border-bottom-color: #000; border-top-color: #FFF; border-left-color: #FFF; text-align: center; text-decoration: none; font-size: 12px; margin: 1px 1px; color: #FFFFFF; } .p1-c { font-size: 12px; text-align: center; } .p1-r { font-size: 12px; text-align: right; } .ver-c { font-size: 10px; font-weight: bold; text-align: center; white-space: nowrap; color: #ffd9b3; } .webLink-c { font-size: 16px; font-weight: bold; background-color: yellow; text-align: center; white-space: nowrap; } body { background-color: #3a4660; background-position: center; overflow: hidden; font-family: arial, helvetica, sans-serif; font-size: 12px; color: #FFFFFF; background-image: url(]].. DialogWindow.myBackGround ..[[); } html { overflow: hidden } table { width: 100%; border: 0; } </style>]] end -- function end
Orgin
Returns Dialog size in a message box showing the X and Y vaalues.
function Orgin() -- Anchor Point -- ================================ DialogWindow.Orgin = [[<table><tr><td colspan="2" class="h2-l">Anchor Point</td></tr><tr class="MyLeft"><td class="MyLeft"><table class="MyCenter"><tr><td><input type="radio" name="DrawingOrigin" checked="checked" value="V1"></td><td><hr></td><td valign="top"><input type="radio" name="DrawingOrigin" checked="checked" value="V2"></td></tr><tr><td class="auto-style9">|</td><td><input type="radio" name="DrawingOrigin" checked="checked" value="V3"></td><td valign="top">|</td></tr><tr><td><input type="radio" name="DrawingOrigin" checked="checked" value="V4"></td><td><hr></td><td valign="top"><input type="radio" name="DrawingOrigin" checked="checked" value="V5"></td></tr></table></td><td width="81%"><table><tr class="MyLeft"><td>X</td><td><input name="OriginX0" type="text" id="OriginX" size="8" maxlength="8"></td></tr><tr class="MyLeft"><td>Y</td><td><input name="OriginY0" type="text" id="OriginY" size="8" maxlength="8"></td></tr></table></td></tr></table>]] end -- function end
GetColor
Returns Dialog size in a message box showing the X and Y vaalues.
function GetColor(str) -- returns the RGB value for the standard color names -- str = "Purple" -- returns = 128 0 128 local Colors = {} Colors.Black = "0,0,0"; Colors.White = "255,255,255"; Colors.Red = "255,0,0" Colors.Lime = "0,255,0"; Colors.Blue = "0,0,255"; Colors.Yellow = "255,255,0" Colors.Cyan = "0,255,255"; Colors.Magenta = "255,0,255"; Colors.Silver = "192,192,192" Colors.Gray = "128,128,128"; Colors.Maroon = "128,0,0"; Colors.Olive = "128,128,0" Colors.Green = "0,128,0"; Colors.Purple = "128,0,128"; Colors.Teal = "0,128,128" Colors.Navy = "0,0,128" local Red, Green, Blue = 0 if "" == str then DisplayMessageBox("Error: Empty string passed") else str = Colors[str] if "string" == type(str) then if string.find(str, ",") then Red = tonumber(string.sub(str, 1, assert(string.find(str, ",") - 1))) str = string.sub(str, assert(string.find(str, ",") + 1)) Green = tonumber(string.sub(str, 1, assert(string.find(str, ",") - 1))) Blue = tonumber(string.sub(str, assert(string.find(str, ",") + 1))) end else DisplayMessageBox("Error: Color Not Found") Red = 0 Green = 0 Blue = 0 end end return Red, Green, Blue end -- function end
StatusMessage
Returns Dialog size in a message box showing the X and Y vaalues.
function StatusMessage(Type, Header, Question, length) -- Standardize messaging dialogues -- StatusMessage("Alert", "Alert Test", "This is a test of Alert", 165) -- StatusMessage("Question", "Question Test", "This is a test of Question", 165) -- StatusMessage("Tick", "Tick Test", "This is a test of Tick", 165) -- StatusMessage("Minus", "Minus Test", "This is a test of Minus", 165) -- StatusMessage("Error", "Error Test", "This is a test of Error", 165) -- StatusMessage("Success", "Success Test", "This is a test of Success", 165) -- StatusMessage("Blank", "Blank Test", "This is a test of Blank", 165) local Image = "" if Type == "Alert" then Image = AlertImage() elseif Type == "Question" then Image = QuestionImage() elseif Type == "Tick" then Image = TickImage() elseif Type == "Minus" then Image = MinusImage() elseif Type == "Error" then Image = ErrorImage() elseif Type == "Success" then Image = SuccessImage() else -- "Status" Image = TickImage() end -- if end local help = [[<html><head><title>]] .. Header ..[[</title><style> .FormButton {font-family: Arial, Helvetica, sans-serif;font-weight: bold;font-size: 12px;white-space: nowrap;background-color: #663300;color: #FFFFFF;width: 75px; }table {width: 100%;border: 0;}.h2-lm {font-family: Arial, Helvetica, sans-serif;font-size: 14px;font-weight: bold;text-align: left;}.h2-r {font-family: Arial, Helvetica, sans-serif;font-size: 14px;font-weight: bold;text-align: right;white-space: nowrap;}.h2-l {font-family: Arial, Helvetica, sans-serif;font-size: 14px;font-weight: bold;text-align: left;white-space: nowrap;}body {background-color: #3a4660;background-position: center;overflow: hidden;font-family: arial, helvetica, sans-serif;font-size: 12px;color: #FFFFFF;background-image: url(]] .. myBackGround() .. [[);}html {overflow: hidden}</style></head><body><table> <tr> <td class="h2-l"><]] .. Image .. [[" width="60" height="60"></td> <td class="h2-lm" id="Question">]] .. Question .. [[</td></tr><tr><td colspan=2><h2><span></span></h2></td> </tr></table><table><tr><td class="h2-r"><input id="ButtonOK" class="FormButton" name="ButtonOK" type="button" value="OK"></td> </tr></table></body></html>]] local dialog = HTML_Dialog(true, help , 550, length, Header) dialog:ShowDialog() return true end -- function end
DialogStringChecks
function DialogStringChecks() local MyTrue = false if Milling.LNBottomProfile == "" then MessageBox("Error: Bottom Profile layer name cannot be blank") OnLuaButton_InquiryLayers() elseif Milling.LNSideProfile == "" then MessageBox("Error: Side Profile layer name cannot be blank") OnLuaButton_InquiryLayers() elseif Milling.LNSidePocket == "" then MessageBox("Error: Side Pocket layer name cannot be blank") OnLuaButton_InquiryLayers() elseif Milling.LNFrontProfile == "" then MessageBox("Error: Front Profile layer name cannot be blank") OnLuaButton_InquiryLayers() elseif Milling.LNFrontPocket == "" then MessageBox("Error: Front Pocket layer name cannot be blank") OnLuaButton_InquiryLayers() elseif Milling.LNBackProfile == "" then MessageBox("Error: Back Profile layer name cannot be blank") OnLuaButton_InquiryLayers() elseif Milling.LNBackPocket == "" then MessageBox("Error: Back Pocket layer name cannot be blank") OnLuaButton_InquiryLayers() elseif Milling.LNDrawNotes == "" then MessageBox("Error: Draw Notes layer name cannot be blank") OnLuaButton_InquiryLayers() elseif Milling.LNPartLabels == "" then MessageBox("Error: Part Lables layer name cannot be blank") OnLuaButton_InquiryLayers() elseif Milling.LNBlume == "" then MessageBox("Error: Blume layer name cannot be blank") OnLuaButton_InquiryLayers() elseif Project.ProjectName == "" then MessageBox("Error: Project Name cannot be blank") OnLuaButton_InquiryProjectInfo() elseif Project.ContactEmail == "" then MessageBox("Error: Contact Email cannot be blank") OnLuaButton_InquiryProjectInfo() elseif Project.ContactName == "" then MessageBox("Error: Contact Name cannot be blank") OnLuaButton_InquiryProjectInfo() elseif Project.ContactPhoneNumber == "" then MessageBox("Error: Project Name cannot be blank") OnLuaButton_InquiryProjectInfo() elseif Project.DrawerID == "" then MessageBox("Error: Contact Phone Number cannot be blank") OnLuaButton_InquiryProjectInfo() elseif Project.ProjectPath == "" then MessageBox("Error: Project Path cannot be blank") OnLuaButton_InquiryProjectInfo() else MyTrue = true end -- if end return MyTrue end -- function end
Directory and File Tools
This object is a name-value pair that represents a Document.
MakeFolder()
Returns Dialog size in a message box showing the X and Y values.
function MakeFolder(xPath) os.execute( "mkdir " .. xPath) return true end -- function end
PathFix()
function PathFix(xPath) -- Returns path with / return string.gsub(xPath, "\\", "/") end -- function end
IsDir()
Validates a directory path
function IsDir(path) -- Returns true if path is found local function exists(file) local ok, err, code = os.rename(file, file) if not ok then if code == 13 then return true end -- if end end -- if end return ok, err end -- function end return exists(path.."/") end -- function end
FileExists()
Returns Dialog size in a message box showing the X and Y values.
function FileExists(name) -- FileExists(name -- DisplayMessageBox(name) local f=io.open(name,"r") if f~=nil then io.close(f) return true else return false end end -- function end
DirectoryProcessor()
Returns number of files that were processed by an operation.
function DirectoryProcessor(job, dir_name, filter, do_sub_dirs, function_ptr) local num_files_processed = 0 local directory_reader = DirectoryReader() local cur_dir_reader = DirectoryReader() directory_reader:BuildDirectoryList(dir_name, do_sub_dirs) directory_reader:SortDirs() local number_of_directories = directory_reader:NumberOfDirs() for i = 1, number_of_directories do local cur_directory = directory_reader:DirAtIndex(i) -- get contents of current directory -- dont include sub dirs, use passed filter cur_dir_reader:BuildDirectoryList(cur_directory.Name, false) cur_dir_reader:GetFiles(filter, true, false) -- call passed method for each file: local num_files_in_dir = cur_dir_reader:NumberOfFiles() for j=1, num_files_in_dir do local file_info = cur_dir_reader:FileAtIndex(j) if not function_ptr(job, file_info.Name) then return true end -- if end num_files_processed = num_files_processed + 1 end -- for end -- empty out our directory object ready for next go cur_dir_reader:ClearDirs() cur_dir_reader:ClearFiles() end -- for end return num_files_processed end -- function end
Drawing Tools
This object is a name-value pair that represents a Document Variable within a VectricJob.
DrawArrowLineArrow
Draws a dimension line with arrow heads and extension leaders
function DrawArrowLineArrow(Pt1, Ext1, Pt2, Ext2, Off, Str, Layer, scale) -- DrawArrowLineArrow(pt1, true, pt3, true, 2.5, "122.5", "TestLayer", 6.0) -- both -- DrawArrowLineArrow(pt1, true, pt3, false, 2.5, "122.5", "TestLayer", 6.0) -- first leader only -- DrawArrowLineArrow(pt1, false, pt3, true, 2.5, "122.5", "TestLayer", 6.0) -- second leader only -- -----------------------------------------------------]] local job = VectricJob() if not job.Exists then DisplayMessageBox("Error: No job loaded") return false end -- if end local DimArrow1Angle = GetPolarDirection(Pt1, Pt2, Polar2D(Pt2, 0.0, 1.0)) local DimArrow2Angle = DimArrow1Angle + 180.0 local LederAng = DimArrow1Angle + 90.0 local LedDrop = LederAng + 180.0 local TxtCenter = GetDistance(Pt1, Pt2) * 0.5 local ArrowLen = 0.125 * scale local StrSet = (string.len(Str) * ArrowLen) * 0.5 local PT01A = Polar2D(Pt1, LederAng, ArrowLen * 2.0) local PT02A = Polar2D(PT01A, LederAng, Off) local PT03A = Polar2D(PT02A, LederAng, ArrowLen) local PT01B = Polar2D(Pt2, LederAng, ArrowLen * 2.0) local PT02B = Polar2D(PT01B, LederAng, Off) local PT03B = Polar2D(PT02B, LederAng, ArrowLen) local Apt1 = Polar2D(PT02A, DimArrow1Angle + 15.0, ArrowLen) local Apt2 = Polar2D(PT02A, DimArrow1Angle - 15.0, ArrowLen) local TxtPt1 = Polar2D(Polar2D(PT02A, DimArrow1Angle, TxtCenter), DimArrow1Angle + 90.0, ArrowLen) local TxtPt = Polar2D(TxtPt1, DimArrow2Angle, StrSet) local ArrowHead = (ArrowLen * 0.333) local line1 = Contour(0.0) local layer1 = job.LayerManager:GetLayerWithName(Layer) line1:AppendPoint(Apt1) line1:LineTo(PT02A) line1:LineTo(Apt2) line1:LineTo(Apt1) layer1:AddObject(CreateCadContour(line1), true) local Apt3 = Polar2D(PT02B, DimArrow2Angle + 15.0, ArrowLen) local Apt4 = Polar2D(PT02B, DimArrow2Angle - 15.0, ArrowLen) local line2 = Contour(0.0) local layer2 = job.LayerManager:GetLayerWithName(Layer) line2:AppendPoint(Apt3) line2:LineTo(PT02B) line2:LineTo(Apt4) line2:LineTo(Apt3) layer2:AddObject(CreateCadContour(line2), true) if Ext1 then local lineA = Contour(0.0) local layerA = job.LayerManager:GetLayerWithName(Layer) lineA:AppendPoint(PT01A) lineA:LineTo(PT03A) layerA:AddObject(CreateCadContour(lineA), true) end -- if end if Ext2 then local lineB = Contour(0.0) local layerB = job.LayerManager:GetLayerWithName(Layer) lineB:AppendPoint(PT01B) lineB:LineTo(PT03B) layerB:AddObject(CreateCadContour(lineB), true) end -- if end local lineC = Contour(0.0) local layerC = job.LayerManager:GetLayerWithName(Layer) lineC:AppendPoint(PT02A) lineC:LineTo(PT02B) layerC:AddObject(CreateCadContour(lineC), true) DrawWriter(Double2Fraction(Str), TxtPt, ArrowLen, Layer, DimArrow1Angle) return true end -- function end
LayerClear
Deletes Layer if empty.
function LayerClear(LayerName) local Mylayer = Milling.job.LayerManager:GetLayerWithName(LayerName) if Mylayer.IsEmpty then Milling.job.LayerManager:RemoveLayer(Mylayer) end -- if end return true end -- function end
LeaderLine
function DrawLeader(Pt1, Pt2, Pt3, Str, Layer, scale) --Draws a leader with text --[[ DrawLeader(pt1, pt2, "122.5", "TestLayer", 6.0) --]] local job = VectricJob() if not job.Exists then DisplayMessageBox("Error: No job loaded") return false end -- if end local ArrowLen = 0.125 * scale local DimArrowAngle = GetPolarDirection(Pt1, Pt2, Polar2D(Pt2, 0.0, 1.0)) local TxtAngle = GetPolarDirection(Pt2, Pt3, Polar2D(Pt3, 0.0, 1.0)) local TxtPt = Polar2D(Polar2D(Pt3, TxtAngle, ArrowLen), TxtAngle-45, H(ArrowLen)) local Apt1 = Polar2D(Pt1, DimArrowAngle + 15.0, ArrowLen) local Apt2 = Polar2D(Pt1, DimArrowAngle - 15.0, ArrowLen) local ArrowHead = ArrowLen * 0.333 local line1 = Contour(0.0) local layer1 = job.LayerManager:GetLayerWithName(Layer) line1:AppendPoint(Pt1) line1:LineTo(Apt2) ; line1:LineTo(Apt1) ; line1:LineTo(Pt1) layer1:AddObject(CreateCadContour(line1), true) local lineC = Contour(0.0) local layerC = job.LayerManager:GetLayerWithName(Layer) lineC:AppendPoint(Pt1) lineC:LineTo(Pt2) lineC:LineTo(Pt3) layerC:AddObject(CreateCadContour(lineC), true) if IsAllNumber(Str) then DrawWriter(Double2Fraction(Str), TxtPt, ArrowLen, Layer, TxtAngle) else DrawWriter(Str, TxtPt, ArrowLen, Layer, TxtAngle) end -- if end return true end -- function end
Scale
Provides the correct scale rate-based drawing units.
function Scale(Num) local mtl_block = MaterialBlock() if mtl_block.InMM then return Num * 25.4 else return Num end end -- function end
AssyHoler
Draws Assy Holes in a stright line (Rabbet and/or Dado).
function AssyHoler(pt1, pt2, PartName) -- Draws Assy Holes in a stright line local Ang1 = GetPolarDirection(pt1, pt2) local Ang2 = GetPolarDirection(pt2, pt1) pt1 = Polar2D(pt1, Ang1, Milling.AssemblyHoleStartEnd) DrawCircle(pt1, Milling.AssemblyHoleRad, Milling.LNAssemblyHole .. PartName) pt2 = Polar2D(pt2, Ang2, Milling.AssemblyHoleStartEnd) DrawCircle(pt2, Milling.AssemblyHoleRad, Milling.LNAssemblyHole .. PartName) local Dist = GetDistance(pt1, pt2) if Project.Debugger then DMark("pt1", pt1) DMark("pt2", pt2) end -- if end BaseScrew(2) Milling.AssemblyHoleSpace = ((Milling.AssemblyHoleMaxSpace + Milling.AssemblyHoleMinSpace) * 0.5) HoleCount = Round(math.floor(Dist / Milling.AssemblyHoleSpace)) HoleSpacing = (Dist / HoleCount) HoleCount = (Dist / HoleSpacing) if (Dist > (HoleSpacing * 2.0)) then for i = HoleCount, 1, -1 do pt1 = Polar2D(pt1, Ang1, HoleSpacing) DrawCircle(pt1, Milling.AssemblyHoleRad, Milling.LNAssemblyHole .. PartName) if Project.Debugger then > DMark("pt1w", pt1) end -- if end BaseScrew(1) end -- for end elseif (Dist > HoleSpacing) then ptC = Polar2D(pt1, Ang1, Dist / 2.0) if Project.Debugger then DMark("ptC", ptC) end -- if end DrawCircle(ptC, Milling.AssemblyHoleRad, Milling.LNAssemblyHole .. PartName) else -- Done No Holes end -- if end return true end -- function end
DrawBoneCenter2Pts
Draws dog bone joints.
function DrawBoneCenter2Pts(pt1, pt2, SlotWidth, BitRadius) Local Project = {} Project.job = VectricJob() Project.ang = GetPolarDirection(pt1, pt2) Project.dis = H(SlotWidth) Project.bit = math.sin(math.rad(45.0)) * BitRadius Project.ptA = Polar2D(pt1, Project.ang + 90.0, Project.dis) Project.ptAa = Polar2D(Project.ptA, Project.ang, Project.bit) Project.ptAb = Polar2D(Project.ptA, Project.ang + 270.0, Project.bit) Project.ptB = Polar2D(pt1, Project.ang + 270.0, Project.dis) Project.ptBa = Polar2D(Project.ptB, Project.ang + 90.0, Project.bit) Project.ptBb = Polar2D(Project.ptB, Project.ang, Project.bit) Project.ptC = Polar2D(pt2, Project.ang + 270.0, Project.dis) Project.ptCa = Polar2D(Project.ptC, Project.ang + 90.0, Project.bit) Project.ptCb = Polar2D(Project.ptC, Project.ang - 180.0, Project.bit) Project.ptD = Polar2D(pt2, Project.ang + 90.0, Project.dis) Project.ptDa = Polar2D(Project.ptD, Project.ang - 180.0, Project.bit) Project.ptDb = Polar2D(Project.ptD, Project.ang + 270.0, Project.bit) Project.line = Contour(0.0) Project.layer = Project.job.LayerManager:GetLayerWithName("DogBone") Project.line:AppendPoint(Project.ptAa) Project.line:ArcTo(Project.ptAb, 1.0) Project.line:LineTo(Project.ptBa) Project.line:ArcTo(Project.ptBb, 1.0) Project.line:LineTo(Project.ptCb) Project.line:ArcTo(Project.ptCa, 1.0) Project.line:LineTo(Project.ptDb) Project.line:ArcTo(Project.ptDa, 1.0) Project.line:LineTo(Project.ptAa) Project.layer:AddObject(CreateCadContour(Project.line), true) return true end -- function end
InsideCornerNipper
Draws the nipping of a corner for easy fitting.
function InsideCornerNipper(AngPlung, BitRadius, CornerPt) local NipLength = math.sin(math.rad(45.0)) * ((BitRadius + 0.04) * 2.0) local Pt1, Pt2 = Point2D() if Material.Orientation == "V" then Pt1 = Polar2D(CornerPt, (AngPlung + 90.0) - 45.0, NipLength) Pt2 = Polar2D(CornerPt, (AngPlung + 90.0) + 45.0, NipLength) else Pt1 = Polar2D(CornerPt, (AngPlung + 180.0) - 45.0, NipLength) Pt2 = Polar2D(CornerPt, (AngPlung + 180.0) + 45.0, NipLength) end return Pt1, Pt2 end -- function end
AddGroupToJob
Builds a Grouping from the layer selection.
function AddGroupToJob(job, group, layer_name) --[[ --------------- AddGroupToJob --------------------------------------------------| | Add passed group to the job - returns object created | Parameters: | job -- job we are working with | group -- group of contours to add to document | layer_name -- name of layer group will be created on| | Return Values: | object created to represent group in document ]] -- create a CadObject to represent the group local cad_object = CreateCadGroup(group); -- create a layer with passed name if it doesnt already exist local layer = job.LayerManager:GetLayerWithName(layer_name) -- and add our object to it layer:AddObject(cad_object, true) return cad_object end -- function end
DrawArc
Draws an Arc from points provided.
function DrawArc(PtS, PtE, ArcRadius, Layer) --[[Draw Arc function main(script_path) local MyPt1 = Point2D(3.5,3.8) local MyPt2 = Point2D(3.5,6.8) local layer = "My Arc" DrawArc(MyPt1, MyPt2, -0.456, Layer) return true end -- function end -- -----------------------------------------------------]] local job = VectricJob() if not job.Exists then DisplayMessageBox("Error: No job loaded") return false end local line = Contour(0.0) local layer = job.LayerManager:GetLayerWithName(Layer) line:AppendPoint(PtS) line:ArcTo(PtE,1); layer:AddObject(CreateCadContour(line), true) return true end -- function end
DrawEllipse
Draws a DrawEllipse from points provided.
function DrawEllipse(CenterPt, LongAxe, ShortAxe, Layer) local LongAngle = 90.0 local ValueAB = (LongAxe - ShortAxe) * 0.50 local ValueAC = ValueAB * math.cos(math.rad(LongAngle)) local job = VectricJob() local LRad = LongAxe * 0.50 local ptT = Polar2D(CenterPt, LongAngle, LRad) local X = 0.0 local pty = Point2D(0.0,0.0) local ptx = Point2D(0.0,0.0) local mylayer = job.LayerManager:GetLayerWithName(Layer) local line = Contour(0.0) line:AppendPoint(ptT) while (X < 360.0) do pty = Polar2D(CenterPt, LongAngle + X, LRad) ValueAC = ValueAB * math.cos(math.rad(LongAngle + X)) if ((LongAngle + X) >= 90.0) then ptx = Polar2D(pty, 180.0, ValueAC) else ptx = Polar2D(pty, 0.0, ValueAC) end line:LineTo(ptx) X = X + 1 end -- while end line:LineTo(ptT) mylayer:AddObject(CreateCadContour(line), true) return true end -- function end
DrawEllipse1
Draws a DrawEllipse from points provided.
function DrawEllipse1(DrawEllipse_CenterPt, DrawEllipse_LongAxe, DrawEllipse_ShortAxe, DrawEllipse_LongAxeAngle, DrawEllipse_Layer) -- ---------------------------------------------------]] function H(x) -- Returns half the value return x * 0.5 end -- function end -- ---------------------------------------------------]] function Polar2D(pt, ang, dis) -- Calculate a new point based on reference point, angle and distance. -- Returns a 2Dpoint(x, y) return Point2D((pt.X + dis * math.cos(math.rad(ang))), (pt.Y + dis * math.sin(math.rad(ang)))) end -- End Function -- ---------------------------------------------------]] function GetDistance(objA, objB) local xDist = objB.x - objA.x local yDist = objB.y - objA.y return math.sqrt((xDist ^ 2) + (yDist ^ 2)) end -- function end -- ---------------------------------------------------]] function Radius2Bulge (p1, p2, Rad) local chord = math.sqrt(((p2.x - p1.x) ^ 2) + ((p2.y - p1.y) ^ 2)) local seg = (Rad - (0.5 * (math.sqrt((4.0 * Rad^2) - chord^2)))) local bulge = (2 * seg) / chord return bulge end -- function end -- ---------------------------------------------------]] function GetPolarAngle(Start, Corner, End) local function GetPolarDirection(point1, point2) -- local ang = math.abs(math.deg(math.atan((point2.Y - point1.Y) / (point2.X - point1.X)))) if point1.X < point2.X then if point1.Y < point2.Y then ang = ang + 0.0 else ang = 360.0 - ang end -- if end else if point1.Y < point2.Y then ang = 180.0 - ang else ang = ang + 180.0 end -- if end end -- if end if ang >=360 then ang = ang -360.0 end -- if end return ang end -- function end return math.abs(GetPolarDirection(Corner, Start) - GetPolarDirection(Corner, End)) end -- function end -- ---------------------------------------------------]] -- Call = DrawEllipse(2DPoint(20.0, 20.0), 20.0, 10.0, 0.0, "Jim") local job = VectricJob() local EndRadius = 0.0 local TopRadius = 0.0 local ptT = Polar2D(DrawEllipse_CenterPt, (90.0 + DrawEllipse_LongAxeAngle), H(DrawEllipse_ShortAxe)) local ptB = Polar2D(DrawEllipse_CenterPt, (270.0 + DrawEllipse_LongAxeAngle), H(DrawEllipse_ShortAxe)) local ptR = Polar2D(DrawEllipse_CenterPt, (0.0 + DrawEllipse_LongAxeAngle), H(DrawEllipse_LongAxe)) local ptL = Polar2D(DrawEllipse_CenterPt, (180.0 + DrawEllipse_LongAxeAngle), H(DrawEllipse_LongAxe)) local ptC = DrawEllipse_CenterPt --[[ DMark("ptC", ptC) DMark("ptT", ptT) DMark("ptB", ptB) DMark("ptL", ptL) DMark("ptR", ptR)]] local C_Offset = H(DrawEllipse_LongAxe - DrawEllipse_ShortAxe) local LT_SlopeDist = H(GetDistance(ptL, ptT) - H(DrawEllipse_LongAxe - DrawEllipse_ShortAxe)) local LT_Dist = GetDistance(ptL, ptT) local LT_Angle = math.abs(90.0 - GetAngle(ptT, ptL, ptC)) local pt_a = Polar2D(ptL, LT_Angle + DrawEllipse_LongAxeAngle, LT_SlopeDist) local aT_Dist = GetDistance(pt_a, ptT) local aC_Dist = aT_Dist / (math.tan(math.rad(LT_Angle))) local Tc_Dist = math.sqrt(aT_Dist^2 + aC_Dist^2) local pt_c = Polar2D(ptT, (270.0 + DrawEllipse_LongAxeAngle), Tc_Dist) local cC_Dist = GetDistance(pt_c, ptC) local b_Dist = math.tan(math.rad(LT_Angle)) * cC_Dist local pt_b = Polar2D(ptC, (180.0 + DrawEllipse_LongAxeAngle), b_Dist) local pt_d = Polar2D(ptB, (90.0 + DrawEllipse_LongAxeAngle), Tc_Dist) local pt_e = Polar2D(ptC, (0.0 + DrawEllipse_LongAxeAngle), b_Dist) local pt1 = Polar2D(pt_d, (270.0 + DrawEllipse_LongAxeAngle) - LT_Angle, Tc_Dist) local pt2 = Polar2D(pt_d, (270.0 + DrawEllipse_LongAxeAngle) + LT_Angle, Tc_Dist) local pt3 = Polar2D(pt_c, (90.0 + DrawEllipse_LongAxeAngle) - LT_Angle, Tc_Dist) local pt4 = Polar2D(pt_c, (90.0 + DrawEllipse_LongAxeAngle) + LT_Angle, Tc_Dist) --[[ DMark("pt1", pt1) DMark("pt2", pt2) DMark("pt3", pt3) DMark("pt4", pt4) local line = Contour(0.0) local layer = job.LayerManager:GetLayerWithName(DrawEllipse_Layer) line:AppendPoint(pt1) line:LineTo(pt2) line:LineTo(pt3) line:LineTo(pt4) line:LineTo(pt1) layer:AddObject(CreateCadContour(line), true)]] local T_Sec = GetDistance(ptC, ptT) - H(GetDistance(pt1, pt4)) local R_Sec = GetDistance(ptC, ptR) - H(GetDistance(pt1, pt2)) local T_Chor = GetDistance(pt1, pt2) local R_Chor = GetDistance(pt1, pt4) local T_Bulge = Radius2Bulge (pt1, pt2, Tc_Dist) local L_Bulge = Radius2Bulge (pt1, pt4, GetDistance(ptL, pt_b)) local line = Contour(0.0) local layer = job.LayerManager:GetLayerWithName(DrawEllipse_Layer) line:AppendPoint(pt1) line:ArcTo(pt2, T_Bulge) line:ArcTo(pt3, L_Bulge) line:ArcTo(pt4, T_Bulge) line:ArcTo(pt1, L_Bulge) layer:AddObject(CreateCadContour(line), true) job:Refresh2DView() return true end -- function end
DrawBox
Draws a Box from points provided.
function DrawBox(p1, p2, p3, p4, Layer) --[[ Draw Box function main(script_path) local MyPt1 = Point2D(1.0,1.0) local MyPt2 = Point2D(1.0,3.0) local MyPt3 = Point2D(3.0,1.0) local MyPt4 = Point2D(3.0,3.0) local layer = "My Box" DrawBox(MyPt1 ,MyPt2, MyPt3, MyPt4, Layer) return true end -- function end -- -----------------------------------------------------]] local job = VectricJob() if not job.Exists then DisplayMessageBox("Error: No job loaded") return false end -- if end local line = Contour(0.0) local layer = job.LayerManager:GetLayerWithName(Layer) line:AppendPoint(p1) line:LineTo(p2) line:LineTo(p3) line:LineTo(p4) line:LineTo(p1) layer:AddObject(CreateCadContour(line), true) return true end -- function end
DrawCircle
Draws a circle.
function DrawCircle(Pt1, CenterRadius, Layer) --[[ ==Draw Circle== function main(script_path) local MyPt1 = Point2D(1.0,1.0) local MyRad = 3.0 local layer = "My Box" DrawCircle(MyPt1, MyRad, Layer) return true end -- function end -- -----------------------------------------------------]] local job = VectricJob() if not job.Exists then DisplayMessageBox("Error: No job loaded") return false end -- if end local pa = Polar2D(Pt1, 180.0, CenterRadius) local pb = Polar2D(Pt1, 0.0, CenterRadius) local Contour = Contour(0.0) local layer = job.LayerManager:GetLayerWithName(Layer) Contour:AppendPoint(pa) Contour:ArcTo(pb, 1) Contour:ArcTo(pa, 1) layer:AddObject(CreateCadContour(Contour), true) return true end -- function end
DrawLine
Draws a Line from points provided.
function DrawLine(Pt1, Pt2, Layer) --[[Draws a line from Pt1 to Pt2 on the layer name. function main(script_path) local MyPt1 = Point2D(3.5,3.8) local MyPt2 = Point2D(3.5,6.8) local layer = "My Line" DrawLine(MyPt1 , MyPt2, MyPt3, Layer) return true end -- function end -- -----------------------------------------------------]] local job = VectricJob() if not job.Exists then DisplayMessageBox("Error: No job loaded") return false end local line = Contour(0.0) local layer = job.LayerManager:GetLayerWithName(Layer) line:AppendPoint(Pt1) line:LineTo(Pt2) layer:AddObject(CreateCadContour(line), true) return true end -- function end
DrawStar
Draws a Star from points provided.
function DrawStar(pt1, InRadius ,OutRadius, layer) --This draw function requires the center point, inter star radius, outer star radius and layer name. --[[ function main(script_path) local MyPt = Point2D(3.5,3.8) local InRadius = 9.0 local OutRadius= 20.0 local layer = "My Star" DrawStar(MyPt , InRadius ,OutRadius, layer) return true end -- function end -- -----------------------------------------------------]] local job = VectricJob() if not job.Exists then DisplayMessageBox("Error: No job loaded") return false end local p1 = Polar2D(pt1, 18.0, OutRadius) local p2 = Polar2D(pt1, 54.0, InRadius) local p3 = Polar2D(pt1, 90.0, OutRadius) local p4 = Polar2D(pt1, 126.0, InRadius) local p5 = Polar2D(pt1, 162.0, OutRadius) local p6 = Polar2D(pt1, 198.0, InRadius) local p7 = Polar2D(pt1, 234.0, OutRadius) local p8 = Polar2D(pt1, 270.0, InRadius) local p9 = Polar2D(pt1, 306.0, OutRadius) local p0 = Polar2D(pt1, 342.0, InRadius) local line = Contour(0.0) -- local layers = job.LayerManager:GetLayerWithName(layer) line:AppendPoint(p1); line:LineTo(p2); line:LineTo(p3) line:LineTo(p4); line:LineTo(p5) line:LineTo(p6); line:LineTo(p7) line:LineTo(p8); line:LineTo(p9) line:LineTo(p0); line:LineTo(p1) layer:AddObject(CreateCadContour(line), true) job:Refresh2DView() return true end -- function end
DrawTriangle
Draws a Triangle from points provided.
function DrawTriangle(p1, p2, p3, Layer) --<nowiki>[[Draw Triangle function main(script_path) local MyPt1 = Point2D(3.5,3.8) local MyPt2 = Point2D(3.5,6.8) local MyPt3 = Point2D(9.8,6.8) local layer = "My Triangle" DrawTriangle(MyPt1 , MyPt2, MyPt3, Layer) return true end -- function end local job = VectricJob() if not job.Exists then DisplayMessageBox("Error: No job loaded") return false end local line = Contour(0.0) local layer = job.LayerManager:GetLayerWithName(Layer) line:AppendPoint(p1) line:LineTo(p2) line:LineTo(p3) line:LineTo(p1) layer:AddObject(CreateCadContour(line), true) job:Refresh2DView() return true end -- function end -- =====================================================]] function Radius2Bulge (p1, p2, Rad) local chord = math.sqrt(((p2.x - p1.x) ^ 2) + ((p2.y - p1.y) ^ 2)) local seg = (Rad - (0.5 * (math.sqrt((4.0 * Rad^2) - chord^2)))) local bulge = (2 * seg) / chord return bulge end -- =====================================================]] function ChordSeg2Radius (Chr, Seg) local rad = (((Chr * Chr)/(Seg * 4)) + Seg) / 2.0 return rad end -- function end
CreateJob
Create a new job/drawing setup.
function CreateJob(job_name, width, height, thickness, in_mm, job_origin, z_on_surface) --[[ ----------- CreateJob ------------------------------------------------- | This function was provided "as is" by Vectric technical team and a part of the gadget API documentation. | Create a new empty job with the passed settings]] -- we fill in most of our bounds in a Box2D local job_bounds = Box2D() local blc = Point2D(0, 0) local trc = Point2D(width, height) local origin_offset = Vector2D(0,0) -- calculate bottom left corner offset for chosen origin if Template.DXFOrientation == "Vertical" then trc = Point2D(height, width) if (job_origin == "BLC") then origin_offset:Set(0, 0) elseif (job_origin == "BRC") then origin_offset:Set(height, 0) elseif (job_origin == "TRC") then origin_offset:Set(height, width) elseif (job_origin == "TLC") then origin_offset:Set(0, width) elseif (job_origin == "CENTRE") then origin_offset:Set(height / 2, width / 2) elseif (job_origin == "CENTER") then origin_offset:Set(height / 2, width / 2) else MessageBox("Unknown XY origin specified " .. job_origin) end else if (job_origin == "BLC") then origin_offset:Set(0, 0) elseif (job_origin == "BRC") then origin_offset:Set(width, 0) elseif (job_origin == "TRC") then origin_offset:Set(width, height) elseif (job_origin == "TLC") then origin_offset:Set(0, height) elseif (job_origin == "CENTRE") then origin_offset:Set(width / 2, height / 2) elseif (job_origin == "CENTER") then origin_offset:Set(width / 2, height / 2) else MessageBox("Unknown XY origin specified " .. job_origin) end end -- subtract the origin offset vector from our 'standard' corner positions to get position for corners for requested origin blc = blc - origin_offset trc = trc - origin_offset job_bounds:Merge(blc) job_bounds:Merge(trc) local success = CreateNewJob(job_name,job_bounds,thickness,in_mm,z_on_surface) return success end -- function end
DrawFontGrid - Draws font grid to create letters
Draws the font grid for drawing new letters.
function DrawFontGrid(job) local pt = Point2D(0.3,0.3) local scl = 1.0 -- (scl * 0.5) local pA0 = pt local ang = 0.0 local pA1 = Polar2D(pt, ang + 90.0000, (0.2500 * scl)) local pA2 = Polar2D(pt, ang + 90.0000, (0.5000 * scl)) local pA3 = Polar2D(pt, ang + 90.0000, (0.7500 * scl)) local pA4 = Polar2D(pt, ang + 90.0000, (1.0000 * scl)) local pA5 = Polar2D(pt, ang + 90.0000, (1.2500 * scl)) local pA6 = Polar2D(pt, ang + 90.0000, (1.5000 * scl)) local pA7 = Polar2D(pt, ang + 90.0000, (1.7500 * scl)) local pA8 = Polar2D(pt, ang + 90.0000, (2.0000 * scl)) local pA9 = Polar2D(pt, ang + 90.0000, (2.2500 * scl)) local pA10 = Polar2D(pt, ang + 90.0000, (2.5000 * scl)) PointCircle(pA0) PointCircle(pA1) PointCircle(pA2) PointCircle(pA3) PointCircle(pA4) PointCircle(pA5) PointCircle(pA6) PointCircle(pA7) PointCircle(pA8) PointCircle(pA9) PointCircle(pA10) local pB0 = Polar2D(pt, ang + 0.0000, (0.2500 * scl)) local pB1 = Polar2D(pt, ang + 45.0000, (0.3536 * scl)) local pB2 = Polar2D(pt, ang + 63.4352, (0.5590 * scl)) local pB3 = Polar2D(pt, ang + 71.5651, (0.7906 * scl)) local pB4 = Polar2D(pt, ang + 75.9638, (1.0308 * scl)) local pB5 = Polar2D(pt, ang + 78.6901, (1.2748 * scl)) local pB6 = Polar2D(pt, ang + 80.5376, (1.5207 * scl)) local pB7 = Polar2D(pt, ang + 81.8699, (1.7678 * scl)) local pB8 = Polar2D(pt, ang + 82.8750, (2.0156 * scl)) local pB10 = Polar2D(pt, ang + 84.2894, (2.5125 * scl)) PointCircle(pB0) PointCircle(pB1) PointCircle(pB2) PointCircle(pB3) PointCircle(pB4) PointCircle(pB5) PointCircle(pB7) PointCircle(pB8) PointCircle(pB10) local pC0 = Polar2D(pt, ang + 0.0000, (0.5000 * scl)) local pC1 = Polar2D(pt, ang + 26.5650, (0.5590 * scl)) local pC2 = Polar2D(pt, ang + 45.0000, (0.7071 * scl)) local pC3 = Polar2D(pt, ang + 56.3099, (0.9014 * scl)) local pC4 = Polar2D(pt, ang + 63.4342, (1.1180 * scl)) local pC5 = Polar2D(pt, ang + 68.1993, (1.3463 * scl)) local pC6 = Polar2D(pt, ang + 71.5650, (1.5811 * scl)) local pC7 = Polar2D(pt, ang + 63.4342, (1.1180 * scl)) local pC8 = Polar2D(pt, ang + 74.0550, (1.8201 * scl)) local pC10 = Polar2D(pt, ang + 78.6899, (2.5495 * scl)) PointCircle(pC0) PointCircle(pC1) PointCircle(pC2) PointCircle(pC3) PointCircle(pC4) PointCircle(pC6) PointCircle(pC8) PointCircle(pC10) local pD0 = Polar2D(pt, ang + 0.0000, (0.6250 * scl)) local pD1 = Polar2D(pt, ang + 21.8014, (0.6731 * scl)) local pD2 = Polar2D(pt, ang + 33.6901, (0.9014 * scl)) local pD4 = Polar2D(pt, ang + 57.9946, (1.1792 * scl)) local pD7 = Polar2D(pt, ang + 70.3462, (1.8583 * scl)) local pD8 = Polar2D(pt, ang + 72.6460, (2.0954 * scl)) PointCircle(pD0) PointCircle(pD1) PointCircle(pD2) PointCircle(pD4) PointCircle(pD7) PointCircle(pD8) local pE0 = Polar2D(pt, ang + 0.0000, (0.7500 * scl)) local pE1 = Polar2D(pt, ang + 18.4346, (0.7906 * scl)) local pE2 = Polar2D(pt, ang + 33.6901, (0.9014 * scl)) local pE3 = Polar2D(pt, ang + 45.0000, (1.0607 * scl)) local pE5 = Polar2D(pt, ang + 59.0371, (1.4578 * scl)) local pE6 = Polar2D(pt, ang + 63.4349, (1.6771 * scl)) local pE7 = Polar2D(pt, ang + 66.4349, (1.9039 * scl)) local pE8 = Polar2D(pt, ang + 69.4440, (2.1360 * scl)) PointCircle(pE0) PointCircle(pE1) PointCircle(pE2) PointCircle(pE3) PointCircle(pE5) PointCircle(pE6) PointCircle(pE7) PointCircle(pE8) local pF0 = Polar2D(pt, ang + 0.0000, (1.0000 * scl)) local pF1 = Polar2D(pt, ang + 14.0360, (1.0308 * scl)) local pF2 = Polar2D(pt, ang + 26.5651, (1.1180 * scl)) local pF3 = Polar2D(pt, ang + 36.8699, (1.2500 * scl)) local pF4 = Polar2D(pt, ang + 45.0000, (1.4142 * scl)) local pF5 = Polar2D(pt, ang + 51.3425, (1.6006 * scl)) local pF6 = Polar2D(pt, ang + 56.3099, (1.8025 * scl)) local pF7 = Polar2D(pt, ang + 60.2551, (2.0156 * scl)) local pF8 = Polar2D(pt, ang + 63.4349, (2.2361 * scl)) PointCircle(pF0) PointCircle(pF1) PointCircle(pF2) PointCircle(pF3) PointCircle(pF4) PointCircle(pF5) PointCircle(pF6) PointCircle(pF7) PointCircle(pF8) local pG0 = Polar2D(pt, ang + 0.0000, (1.2500 * scl)) local pG1 = Polar2D(pt, ang + 11.3099, (1.2748 * scl)) local pG2 = Polar2D(pt, ang + 21.8014, (1.3463 * scl)) local pG3 = Polar2D(pt, ang + 30.9638, (1.4577 * scl)) local pG4 = Polar2D(pt, ang + 38.6598, (1.6008 * scl)) local pG5 = Polar2D(pt, ang + 45.0000, (1.7678 * scl)) local pG6 = Polar2D(pt, ang + 50.1944, (1.9526 * scl)) local pG7 = Polar2D(pt, ang + 54.4623, (2.1506 * scl)) local pG8 = Polar2D(pt, ang + 57.9946, (2.3585 * scl)) local pG10 = Polar2D(pt,59.0362, (2.9155 * scl)) PointCircle(pG0) PointCircle(pG1) PointCircle(pG2) PointCircle(pG3) PointCircle(pG4) PointCircle(pG5) PointCircle(pG6) PointCircle(pG7) PointCircle(pG8) PointCircle(pG10) local pH0 = Polar2D(pt, ang + 0.0000, (1.5000 * scl)) local pH10 = Polar2D(pt, 63.4349, (2.7951 * scl)) PointCircle(pH0) PointCircle(pH10) job:Refresh2DView() return true end -- ========================================================================= local function AddGroupToJob(job, group, layer_name) -- create a CadObject to represent the group local cad_object = CreateCadGroup(group); -- create a layer with passed name if it doesnt already exist local layer = job.LayerManager:GetLayerWithName(layer_name) -- and add our object to it layer:AddObject(cad_object, true) return cad_object end -- end function -- ========================================================================= local job = VectricJob() if not job.Exists then DisplayMessageBox("Error: Not finding a job loaded") return false end local strlen = string.len(what) local strup = string.upper(what) local x = strlen local i = 1 local y = "" local ptx = where group = ContourGroup(true) while i <= x do y = string.byte(string.sub(strup, i, i)) ptx = MonoFont(job, ptx, y, size, lay, ang) i = i + 1 end -- while end; AddGroupToJob(job, group, lay) job:Refresh2DView() return true ; end -- function end
DrawWriter - Draws Upper and Lower case text on the drawing
function DrawWriter(what, where, size, lay, ang) -- Draws Upper and Lower case text on the drawing. --[[ How to use: | local TextMessage = "Your Text Here" | local TextPt = Point2D(3.5,3.8) | local TextHight = 0.5 | local TextLayer = "Text Layer" | local TextAng = 20.0 | DrawWriter(TextMessage, TextPt , TextHight , TextLayer, TextAng) | -- ==Draw Writer== | -- Utilizing a provided string of text, the program walks the string and reproduces each letter (parametrically) on the drawing using vectors. function main() -- create a layer with passed name if it doesn't already exist local job = VectricJob() if not job.Exists then DisplayMessageBox("No job loaded") return false; end local TextMessage = "Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm Nn Oo Pp Qq Rr Ss Tt Uu Vv Ww Xx Yy Zz 1 2 3 4 5 6 7 8 9 0 ! @ # $ % & * ( ) { } [ ] ? , . : ; '' ' _ - + = ~ ^ < > |" local TextPt = Point2D(0.1, 2.0) local TextHight = 0.25 local TextLayer = "Gadget Text" local TextAng = 10.0 DrawWriter(TextMessage, TextPt, TextHight, TextLayer, TextAng) job:Refresh2DView() return true end --]] -- ========================================================================= local function Polar2D(pt, ang, dis) return Point2D((pt.X + dis * math.cos(math.rad(ang))), (pt.Y + dis * math.sin(math.rad(ang)))) end -- ========================================================================= local function MonoFont(job, pt, letter, scl, lay, ang) scl = (scl * 0.5) ; local pA0 = pt ; local pA1 = Polar2D(pt, ang + 90.0000, (0.2500 * scl)) ; local pA2 = Polar2D(pt, ang + 90.0000, (0.5000 * scl)) ; local pA3 = Polar2D(pt, ang + 90.0000, (0.7500 * scl)) ; local pA4 = Polar2D(pt, ang + 90.0000, (1.0000 * scl)) ; local pA5 = Polar2D(pt, ang + 90.0000, (1.2500 * scl)) ; local pA6 = Polar2D(pt, ang + 90.0000, (1.5000 * scl)) ; local pA7 = Polar2D(pt, ang + 90.0000, (1.7500 * scl)) ; local pA8 = Polar2D(pt, ang + 90.0000, (2.0000 * scl)) ; local pA9 = Polar2D(pt, ang + 90.0000, (2.2500 * scl)) ; local pA10 = Polar2D(pt, ang + 90.0000, (2.5000 * scl)) ; local pB0 = Polar2D(pt, ang + 0.0000, (0.2500 * scl)) ; local pB1 = Polar2D(pt, ang + 45.0000, (0.3536 * scl)) ; local pB2 = Polar2D(pt, ang + 63.4352, (0.5590 * scl)) ; local pB3 = Polar2D(pt, ang + 71.5651, (0.7906 * scl)) ; local pB4 = Polar2D(pt, ang + 75.9638, (1.0308 * scl)) ; local pB5 = Polar2D(pt, ang + 78.6901, (1.2748 * scl)) ; local pB6 = Polar2D(pt, ang + 80.5376, (1.5207 * scl)) ; local pB7 = Polar2D(pt, ang + 81.8699, (1.7678 * scl)) ; local pB8 = Polar2D(pt, ang + 82.8750, (2.0156 * scl)) ; local pB10 = Polar2D(pt, ang + 84.2894, (2.5125 * scl)) ; local pC0 = Polar2D(pt, ang + 0.0000, (0.5000 * scl)) ; local pC1 = Polar2D(pt, ang + 26.5650, (0.5590 * scl)) ; local pC2 = Polar2D(pt, ang + 45.0000, (0.7071 * scl)) ; local pC3 = Polar2D(pt, ang + 56.3099, (0.9014 * scl)) ; local pC4 = Polar2D(pt, ang + 63.4342, (1.1180 * scl)) ; local pC5 = Polar2D(pt, ang + 68.1993, (1.3463 * scl)) ; local pC6 = Polar2D(pt, ang + 71.5650, (1.5811 * scl)) ; local pC7 = Polar2D(pt, ang + 63.4342, (1.1180 * scl)) ; local pC8 = Polar2D(pt, ang + 75.9640, (2.0616 * scl)) ; local pC10 = Polar2D(pt, ang + 78.6899, (2.5495 * scl)) ; local pD0 = Polar2D(pt, ang + 0.0000, (0.6250 * scl)) ; local pD1 = Polar2D(pt, ang + 21.8014, (0.6731 * scl)) ; local pD2 = Polar2D(pt, ang + 33.6901, (0.9014 * scl)) ; local pD4 = Polar2D(pt, ang + 57.9946, (1.1792 * scl)) ; local pD7 = Polar2D(pt, ang + 70.3462, (1.8583 * scl)) ; local pD8 = Polar2D(pt, ang + 72.6460, (2.0954 * scl)) ; local pE0 = Polar2D(pt, ang + 0.0000, (0.7500 * scl)) ; local pE1 = Polar2D(pt, ang + 18.4346, (0.7906 * scl)) ; local pE2 = Polar2D(pt, ang + 33.6901, (0.9014 * scl)) ; local pE3 = Polar2D(pt, ang + 45.0000, (1.0607 * scl)) ; local pE5 = Polar2D(pt, ang + 59.0371, (1.4578 * scl)) ; local pE6 = Polar2D(pt, ang + 63.4349, (1.6771 * scl)) ; local pE7 = Polar2D(pt, ang + 66.4349, (1.9039 * scl)) ; local pE8 = Polar2D(pt, ang + 69.4440, (2.1360 * scl)) ; local pF0 = Polar2D(pt, ang + 0.0000, (1.0000 * scl)) ; local pF1 = Polar2D(pt, ang + 14.0360, (1.0308 * scl)) ; local pF2 = Polar2D(pt, ang + 26.5651, (1.1180 * scl)) ; local pF3 = Polar2D(pt, ang + 36.8699, (1.2500 * scl)) ; local pF4 = Polar2D(pt, ang + 45.0000, (1.4142 * scl)) ; local pF5 = Polar2D(pt, ang + 51.3425, (1.6006 * scl)) ; local pF6 = Polar2D(pt, ang + 56.3099, (1.8025 * scl)) ; local pF7 = Polar2D(pt, ang + 60.2551, (2.0156 * scl)) ; local pF8 = Polar2D(pt, ang + 63.4349, (2.2361 * scl)) ; local pG0 = Polar2D(pt, ang + 0.0000, (1.2500 * scl)) ; local pG1 = Polar2D(pt, ang + 11.3099, (1.2748 * scl)) ; local pG2 = Polar2D(pt, ang + 21.8014, (1.3463 * scl)) ; local pG3 = Polar2D(pt, ang + 30.9638, (1.4577 * scl)) ; local pG4 = Polar2D(pt, ang + 38.6598, (1.6008 * scl)) ; local pG5 = Polar2D(pt, ang + 45.0000, (1.7678 * scl)) ; local pG6 = Polar2D(pt, ang + 50.1944, (1.9526 * scl)) ; local pG7 = Polar2D(pt, ang + 54.4623, (2.1506 * scl)) ; local pG8 = Polar2D(pt, ang + 57.9946, (2.3585 * scl)) ; local pG10 = Polar2D(pt,59.0362, (2.9155 * scl)) ; local pH0 = Polar2D(pt, ang + 0.0000, (1.5000 * scl)) ; local pH10 = Polar2D(pt,63.4349, (2.7951 * scl)) ; local layer = job.LayerManager:GetLayerWithName(lay) ; local line = Contour(0.0) ; -- ------------------------------------------------------------------------ if letter == 32 then pH0 = pH0 end if letter == 33 then line:AppendPoint(pB0) ; line:LineTo(pE0) ; line:LineTo(pE2) ; line:LineTo(pB2) ; line:LineTo(pB0) ; group:AddTail(line) ; line = Contour(0.0) line:AppendPoint(pB3) ; line:LineTo(pE3) ; line:LineTo(pE8) ; line:LineTo(pB8) ; line:LineTo(pB3) ; group:AddTail(line) ; end if letter == 34 then line:AppendPoint(pA7) ; line:LineTo(pB10) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pB7) ; line:LineTo(pC10) ; group:AddTail(line) ; pH0 = pE0 end if letter == 35 then line:AppendPoint(pA2) ; line:LineTo(pG2) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pA6) ; line:LineTo(pG6) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pB0) ; line:LineTo(pB8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pF0) ; line:LineTo(pF8) ; group:AddTail(line) ; end if letter == 36 then line:AppendPoint(pA1) ; line:LineTo(pB0) ; line:LineTo(pF0) ; line:LineTo(pG1) ; line:LineTo(pG3) ; line:LineTo(pF4) ; line:LineTo(pB4) ; line:LineTo(pA5) ; line:LineTo(pA7) ; line:LineTo(pB8) ; line:LineTo(pF8) ; line:LineTo(pG7) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pC0) ; line:LineTo(pE0) ; line:LineTo(pE8) ; line:LineTo(pC8) ; line:LineTo(pC0) ; group:AddTail(line) ; end if letter == 37 then line:AppendPoint(pC6) ; line:LineTo(pC8) ; line:LineTo(pA8) ; line:LineTo(pA6) ; line:LineTo(pE6) ; line:LineTo(pG8) ; line:LineTo(pA0) ; line:LineTo(pC2) ; line:LineTo(pG2) ; line:LineTo(pG0) ; line:LineTo(pE0) ; line:LineTo(pE2) ; group:AddTail(line) ; end if letter == 38 then line:AppendPoint(pG2) ; line:LineTo(pG1) ; line:LineTo(pF0) ; line:LineTo(pB0) ; line:LineTo(pA1) ; line:LineTo(pA3) ; line:LineTo(pE6) ; line:LineTo(pE7) ; line:LineTo(pD8) ; line:LineTo(pB8) ; line:LineTo(pA7) ; line:LineTo(pA6) ; line:LineTo(pG0) ; group:AddTail(line) ; end if letter == 39 then line:AppendPoint(pA7) ; line:LineTo(pB10) ; group:AddTail(line) ; pH0 = pC0 end if letter == 40 then line:AppendPoint(pB8) ; line:LineTo(pA5) ; line:LineTo(pA3) ; line:LineTo(pB0) ; group:AddTail(line) ; pH0 = pD0 end if letter == 41 then line:AppendPoint(pA8) ; line:LineTo(pB5) ; line:LineTo(pB3) ; line:LineTo(pA0) ; group:AddTail(line) ; pH0 = pG0 end if letter == 42 then line:AppendPoint(pA2) ; line:LineTo(pG6) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pA6) ; line:LineTo(pG2) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pA4) ; line:LineTo(pG4) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pD7) ; line:LineTo(pD1) ; group:AddTail(line) ; end if letter == 43 then line:AppendPoint(pA4) ; line:LineTo(pG4) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pD1) ; line:LineTo(pD7) ; group:AddTail(line) end if letter == 44 then line:AppendPoint(pC0) ; line:LineTo(pE2) ; line:LineTo(pC2) ; line:LineTo(pC4) ; line:LineTo(pF4) ; line:LineTo(pF2) ; line:LineTo(pD0) ; line:LineTo(pC0) ; group:AddTail(line) ; end if letter == 45 then line:AppendPoint(pA4) ; line:LineTo(pG4) ; group:AddTail(line) ; end if letter == 46 then line:AppendPoint(pA1) ; line:LineTo(pB1) ; line:LineTo(pB0) ; line:LineTo(pA0) ; line:LineTo(pA1) ; group:AddTail(line) ; pH0 = pD0 ; end if letter == 47 then line:AppendPoint(pA0) ; line:LineTo(pF8) ; group:AddTail(line) ; pH0 = pG0 ; end if letter == 48 then line:AppendPoint(pB0) ; line:LineTo(pA2) ; line:LineTo(pA6) ; line:LineTo(pB8) ; line:LineTo(pF8) ; line:LineTo(pG6) ; line:LineTo(pG2) ; line:LineTo(pF0) ; line:LineTo(pB0) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pG8) ; line:LineTo(pA0) ; group:AddTail(line) ; end if letter == 49 then line:AppendPoint(pA6) ; line:LineTo(pD8) ; line:LineTo(pD0) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pA0) ; line:LineTo(pG0) ; group:AddTail(line) ; end if letter == 50 then line:AppendPoint(pA6) ; line:LineTo(pA7) ; line:LineTo(pB8) ; line:LineTo(pF8) ; line:LineTo(pG7) ; line:LineTo(pG5) ; line:LineTo(pA2) ; line:LineTo(pA0) ; line:LineTo(pG0) ; group:AddTail(line) ; end if letter == 51 then line:AppendPoint(pA7) ; line:LineTo(pB8) ; line:LineTo(pF8) ; line:LineTo(pG7) ; line:LineTo(pG5) ; line:LineTo(pF4) ; line:LineTo(pG3) ; line:LineTo(pG1) ; line:LineTo(pF0) ; line:LineTo(pB0) ; line:LineTo(pA1) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pF4) ; line:LineTo(pB4) ; group:AddTail(line) ; end if letter == 52 then line:AppendPoint(pF0) ; line:LineTo(pF8) ; line:LineTo(pA2) ; line:LineTo(pG2) ; group:AddTail(line) ; end if letter == 53 then line:AppendPoint(pG8) ; line:LineTo(pA8) ; line:LineTo(pA5) ; line:LineTo(pF4) ; line:LineTo(pG3) ; line:LineTo(pG1) ; line:LineTo(pF0) ; line:LineTo(pB0) ; line:LineTo(pA1) ; line:LineTo(pA2) ; group:AddTail(line) ; end if letter == 54 then line:AppendPoint(pG7) ; line:LineTo(pF8) ; line:LineTo(pB8) ; line:LineTo(pA7) ; line:LineTo(pA1) ; line:LineTo(pB0) ; line:LineTo(pF0) ; line:LineTo(pG1) ; line:LineTo(pG3) ; line:LineTo(pF4) ; line:LineTo(pB4) ; line:LineTo(pA2) ; group:AddTail(line) ; end if letter == 55 then line:AppendPoint(pB0) ; line:LineTo(pG8) ; line:LineTo(pA8) ; group:AddTail(line) ; end if letter == 56 then line:AppendPoint(pA1) ; line:LineTo(pB0) ; line:LineTo(pF0) ; line:LineTo(pG1) ; line:LineTo(pG3) ; line:LineTo(pF4) ; line:LineTo(pG5) ; line:LineTo(pG7) ; line:LineTo(pF8) ; line:LineTo(pB8) ; line:LineTo(pA7) ; line:LineTo(pA5) ; line:LineTo(pB4) ; line:LineTo(pA3) ; line:LineTo(pA1) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pB4) ; line:LineTo(pF4) ; group:AddTail(line) ; end if letter == 57 then line:AppendPoint(pA1) ; line:LineTo(pB0) ; line:LineTo(pF0) ; line:LineTo(pG3) ; line:LineTo(pG7) ; line:LineTo(pF8) ; line:LineTo(pB8) ; line:LineTo(pA7) ; line:LineTo(pA5) ; line:LineTo(pB4) ; line:LineTo(pF4) ; line:LineTo(pG5) ; group:AddTail(line) ; end if letter == 58 then line:AppendPoint(pB8) ; line:LineTo(pA8) ; line:LineTo(pA7) ; line:LineTo(pB7) ; line:LineTo(pB8) ; line:LineTo(pA8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pA1) ; line:LineTo(pB1) ; line:LineTo(pB0) ; line:LineTo(pA0) ; line:LineTo(pA1) ; group:AddTail(line) ; pH0 = pD0 ; end if letter == 59 then line:AppendPoint(pB8) ; line:LineTo(pA8) ; line:LineTo(pA7) ; line:LineTo(pB7) ; line:LineTo(pB8) ; line:LineTo(pA8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pB3) ; line:LineTo(pB4) ; line:LineTo(pA4) ; line:LineTo(pA3) ; line:LineTo(pB3) ; line:LineTo(pA0) ; group:AddTail(line) ; pH0 = pD0 ; end if letter == 60 then line:AppendPoint(pF8) ; line:LineTo(pA4) ; line:LineTo(pG0) ; group:AddTail(line) end if letter == 61 then line:AppendPoint(pA2) ; line:LineTo(pG2) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pA6) ; line:LineTo(pG6) ; group:AddTail(line) ; end if letter == 62 then line:AppendPoint(pA8) ; line:LineTo(pF4) ; line:LineTo(pA0) ; group:AddTail(line) ; end if letter == 63 then line:AppendPoint(pB5) ; line:LineTo(pA6) ; line:LineTo(pA7) ; line:LineTo(pB8) ; line:LineTo(pE8) ; line:LineTo(pF7) ; line:LineTo(pF5) ; line:LineTo(pC3) ; line:LineTo(pC2) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pB0) ; line:LineTo(pE0) ; line:LineTo(pE1) ; line:LineTo(pB1) ; line:LineTo(pB0) ; group:AddTail(line) ; end if letter == 64 then line:AppendPoint(pG0) ; line:LineTo(pB0) ; line:LineTo(pA2) ; line:LineTo(pA6) ; line:LineTo(pB8) ; line:LineTo(pF8) ; line:LineTo(pG6) ; line:LineTo(pG3) ; line:LineTo(pE2) ; line:LineTo(pB2) ; line:LineTo(pB5) ; line:LineTo(pE5) ; line:LineTo(pE2) ; group:AddTail(line) end if letter == 65 then line:AppendPoint(pA0) ; line:LineTo(pD8) ; line:LineTo(pG0) ; line:LineTo(pF3) ; line:LineTo(pB3) ; line:LineTo(pA0) ; group:AddTail(line) ; end if letter == 66 then line:AppendPoint(pA4) ; line:LineTo(pF4) ; line:LineTo(pG5) ; line:LineTo(pG7) ; line:LineTo(pF8) ; line:LineTo(pA8) ; line:LineTo(pA0) ; line:LineTo(pF0) ; line:LineTo(pG1) ; line:LineTo(pG3) ; line:LineTo(pF4) ; group:AddTail(line) ; end if letter == 67 then line:AppendPoint(pG2) ; line:LineTo(pF0) ; line:LineTo(pB0) ; line:LineTo(pA2) ; line:LineTo(pA6) ; line:LineTo(pB8) ; line:LineTo(pF8) ; line:LineTo(pG6) ; group:AddTail(line) ; end if letter == 68 then line:AppendPoint(pA0) ; line:LineTo(pF0) ; line:LineTo(pG2) ; line:LineTo(pG6) ; line:LineTo(pF8) ; line:LineTo(pA8) ; line:LineTo(pA0) ; group:AddTail(line) ; end if letter == 69 then line:AppendPoint(pG0) ; line:LineTo(pA0) ; line:LineTo(pA8) ; line:LineTo(pF8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pA4) ; line:LineTo(pD4) ; group:AddTail(line) ; end if letter == 70 then line:AppendPoint(pA0) ; line:LineTo(pA8) ; line:LineTo(pG8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pA4) ; line:LineTo(pF4) ; group:AddTail(line) ; end if letter == 71 then line:AppendPoint(pG6) ; line:LineTo(pG7) ; line:LineTo(pF8) ; line:LineTo(pB8) ; line:LineTo(pA6) ; line:LineTo(pA2) ; line:LineTo(pB0) ; line:LineTo(pF0) ; line:LineTo(pG2) ; line:LineTo(pG3) ; line:LineTo(pE3) ; line:LineTo(pE2) ; group:AddTail(line) ; end if letter == 72 then line:AppendPoint(pA0) ; line:LineTo(pA8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pG0) ; line:LineTo(pG8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pA4) ; line:LineTo(pG4) ; group:AddTail(line) ; end if letter == 73 then line:AppendPoint(pB0) ; line:LineTo(pB8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pA0) ; line:LineTo(pC0) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pA8) ; line:LineTo(pC8) ; group:AddTail(line) ; pH0 = pE0 ; end if letter == 74 then line:AppendPoint(pA2) ; line:LineTo(pB0) ; line:LineTo(pF0) ; line:LineTo(pG2) ; line:LineTo(pG8) ; line:LineTo(pC8) ; group:AddTail(line) ; end if letter == 75 then line:AppendPoint(pA0) ; line:LineTo(pA8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pA2) ; line:LineTo(pG7) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pD4) ; line:LineTo(pG0) ; group:AddTail(line) ; end if letter == 76 then line:AppendPoint(pA8) ; line:LineTo(pA0) ; line:LineTo(pG0) ; group:AddTail(line) ; end if letter == 77 then line:AppendPoint(pA0) ; line:LineTo(pA8) ; line:LineTo(pD4) ; line:LineTo(pG8) ; line:LineTo(pG0) ; group:AddTail(line) ; end if letter == 78 then line:AppendPoint(pA0) ; line:LineTo(pA8) ; line:LineTo(pF0) ; line:LineTo(pF8) ; group:AddTail(line) ; pH0 = pG0 ; end if letter == 79 then line:AppendPoint(pB0) ; line:LineTo(pA2) ; line:LineTo(pA6) ; line:LineTo(pB8) ; line:LineTo(pF8) ; line:LineTo(pG6) ; line:LineTo(pG2) ; line:LineTo(pF0) ; line:LineTo(pB0) ; group:AddTail(line) ; end if letter == 80 then line:AppendPoint(pA0) ; line:LineTo(pA8) ; line:LineTo(pF8) ; line:LineTo(pG7) ; line:LineTo(pG5) ; line:LineTo(pF4) ; line:LineTo(pA4) ; group:AddTail(line) ; end if letter == 81 then line:AppendPoint(pB0) ; line:LineTo(pA2) ; line:LineTo(pA6) ; line:LineTo(pB8) ; line:LineTo(pF8) ; line:LineTo(pG6) ; line:LineTo(pG2) ; line:LineTo(pF0) ; line:LineTo(pB0) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pG0) ; line:LineTo(pD4) ; group:AddTail(line) end if letter == 82 then line:AppendPoint(pA0) ; line:LineTo(pA8) ; line:LineTo(pF8) ; line:LineTo(pG7) ; line:LineTo(pG5) ; line:LineTo(pF4) ; line:LineTo(pA4) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pD4) ; line:LineTo(pG0) ; group:AddTail(line) ; end if letter == 83 then line:AppendPoint(pG5) ; line:LineTo(pG6) ; line:LineTo(pF8) ; line:LineTo(pB8) ; line:LineTo(pA6) ; line:LineTo(pA5) ; line:LineTo(pG3) ; line:LineTo(pG2) ; line:LineTo(pF0) ; line:LineTo(pB0) ; line:LineTo(pA2) ; line:LineTo(pA3) ; group:AddTail(line) ; end if letter == 84 then line:AppendPoint(pA8) ; line:LineTo(pG8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pD8) ; line:LineTo(pD0) ; group:AddTail(line) ; end if letter == 85 then line:AppendPoint(pA8) ; line:LineTo(pA2) ; line:LineTo(pB0) ; line:LineTo(pF0) ; line:LineTo(pG2) ; line:LineTo(pG8) ; group:AddTail(line) ; end if letter == 86 then line:AppendPoint(pA8) ; line:LineTo(pD0) ; line:LineTo(pG8) ; group:AddTail(line) ; end if letter == 87 then line:AppendPoint(pA8) ; line:LineTo(pB0) ; line:LineTo(pD4) ; line:LineTo(pF0) ; line:LineTo(pG8) ; group:AddTail(line) ; end if letter == 88 then line:AppendPoint(pA0) ; line:LineTo(pG8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pA8) ; line:LineTo(pG0) ; group:AddTail(line) ; end if letter == 89 then line:AppendPoint(pA8) ; line:LineTo(pD4) ; line:LineTo(pG8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pD0) ; line:LineTo(pD4) ; group:AddTail(line) ; end if letter == 90 then line:AppendPoint(pA8) ; line:LineTo(pG8) ; line:LineTo(pA0) ; line:LineTo(pG0) ; group:AddTail(line) ; end if letter == 91 then line:AppendPoint(pC0) ; line:LineTo(pB0) ; line:LineTo(pB8) ; line:LineTo(pC8) ; group:AddTail(line) ; end if letter == 92 then line:AppendPoint(pA4) ; line:LineTo(pG4) ; group:AddTail(line) ; end if letter == 93 then line:AppendPoint(pE0) ; line:LineTo(pF0) ; line:LineTo(pF8) ; line:LineTo(pE8) ; group:AddTail(line) ; end if letter == 94 then line:AppendPoint(pD8) ; line:LineTo(pG6) ; line:LineTo(pG5) ; line:LineTo(pD7) ; line:LineTo(pA5) ; line:LineTo(pA6) ; line:LineTo(pD8) ; group:AddTail(line) ; end if letter == 95 then line:AppendPoint(pA0) ; line:LineTo(pF0) ; group:AddTail(line) ; end if letter == 96 then line:AppendPoint(pA4) ; line:LineTo(pG4) ; group:AddTail(line) ; end -- Start of Lower Case if letter == 97 then line:AppendPoint(pA0) ; line:LineTo(pD8) ; line:LineTo(pG0) ; line:LineTo(pF3) ; line:LineTo(pB3) ; line:LineTo(pA0) ; group:AddTail(line) ; end if letter == 98 then line:AppendPoint(pA4) ; line:LineTo(pF4) ; line:LineTo(pG5) ; line:LineTo(pG7) ; line:LineTo(pF8) ; line:LineTo(pA8) ; line:LineTo(pA0) ; line:LineTo(pF0) ; line:LineTo(pG1) ; line:LineTo(pG3) ; line:LineTo(pF4) ; group:AddTail(line) ; end if letter == 99 then line:AppendPoint(pG2) ; line:LineTo(pF0) ; line:LineTo(pB0) ; line:LineTo(pA2) ; line:LineTo(pA6) ; line:LineTo(pB8) ; line:LineTo(pF8) ; line:LineTo(pG6) ; group:AddTail(line) ; end if letter == 100 then line:AppendPoint(pA0) ; line:LineTo(pF0) ; line:LineTo(pG2) ; line:LineTo(pG6) ; line:LineTo(pF8) ; line:LineTo(pA8) ; line:LineTo(pA0) ; group:AddTail(line) ; end if letter == 101 then line:AppendPoint(pG0) ; line:LineTo(pA0) ; line:LineTo(pA8) ; line:LineTo(pF8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pA4) ; line:LineTo(pD4) ; group:AddTail(line) ; end if letter == 102 then line:AppendPoint(pA0) ; line:LineTo(pA8) ; line:LineTo(pG8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pA4) ; line:LineTo(pF4) ; group:AddTail(line) ; end if letter == 103 then line:AppendPoint(pG6) ; line:LineTo(pG7) ; line:LineTo(pF8) ; line:LineTo(pB8) ; line:LineTo(pA6) ; line:LineTo(pA2) ; line:LineTo(pB0) ; line:LineTo(pF0) ; line:LineTo(pG2) ; line:LineTo(pG3) ; line:LineTo(pE3) ; line:LineTo(pE2) ; group:AddTail(line) ; end if letter == 104 then line:AppendPoint(pA0) ; line:LineTo(pA8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pG0) ; line:LineTo(pG8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pA4) ; line:LineTo(pG4) ; group:AddTail(line) ; end if letter == 105 then line:AppendPoint(pB0) ; line:LineTo(pB8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pA0) ; line:LineTo(pC0) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pA8) ; line:LineTo(pC8) ; group:AddTail(line) ; pH0 = pE0 ; end if letter == 106 then line:AppendPoint(pA2) ; line:LineTo(pB0) ; line:LineTo(pF0) ; line:LineTo(pG2) ; line:LineTo(pG8) ; line:LineTo(pC8) ; group:AddTail(line) ; end if letter == 107 then line:AppendPoint(pA0) ; line:LineTo(pA8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pA2) ; line:LineTo(pG7) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pD4) ; line:LineTo(pG0) ; group:AddTail(line) ; end if letter == 108 then line:AppendPoint(pA8) ; line:LineTo(pA0) ; line:LineTo(pG0) ; group:AddTail(line) ; end if letter == 109 then line:AppendPoint(pA0) ; line:LineTo(pA8) ; line:LineTo(pD4) ; line:LineTo(pG8) ; line:LineTo(pG0) ; group:AddTail(line) ; end if letter == 110 then line:AppendPoint(pA0) ; line:LineTo(pA8) ; line:LineTo(pF0) ; line:LineTo(pF8) ; group:AddTail(line) ; pH0 = pG0 ; end if letter == 111 then line:AppendPoint(pB0) ; line:LineTo(pA2) ; line:LineTo(pA6) ; line:LineTo(pB8) ; line:LineTo(pF8) ; line:LineTo(pG6) ; line:LineTo(pG2) ; line:LineTo(pF0) ; line:LineTo(pB0) ; group:AddTail(line) ; end if letter == 112 then line:AppendPoint(pA0) ; line:LineTo(pA8) ; line:LineTo(pF8) ; line:LineTo(pG7) ; line:LineTo(pG5) ; line:LineTo(pF4) ; line:LineTo(pA4) ; group:AddTail(line) ; end if letter == 113 then line:AppendPoint(pB0) ; line:LineTo(pA2) ; line:LineTo(pA6) ; line:LineTo(pB8) ; line:LineTo(pF8) ; line:LineTo(pG6) ; line:LineTo(pG2) ; line:LineTo(pF0) ; line:LineTo(pB0) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pG0) ; line:LineTo(pD4) ; group:AddTail(line) end if letter == 114 then line:AppendPoint(pA0) ; line:LineTo(pA8) ; line:LineTo(pF8) ; line:LineTo(pG7) ; line:LineTo(pG5) ; line:LineTo(pF4) ; line:LineTo(pA4) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pD4) ; line:LineTo(pG0) ; group:AddTail(line) ; end if letter == 115 then line:AppendPoint(pG5) ; line:LineTo(pG6) ; line:LineTo(pF8) ; line:LineTo(pB8) ; line:LineTo(pA6) ; line:LineTo(pA5) ; line:LineTo(pG3) ; line:LineTo(pG2) ; line:LineTo(pF0) ; line:LineTo(pB0) ; line:LineTo(pA2) ; line:LineTo(pA3) ; group:AddTail(line) ; end if letter == 116 then line:AppendPoint(pA8) ; line:LineTo(pG8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pD8) ; line:LineTo(pD0) ; group:AddTail(line) ; end if letter == 117 then line:AppendPoint(pA8) ; line:LineTo(pA2) ; line:LineTo(pB0) ; line:LineTo(pF0) ; line:LineTo(pG2) ; line:LineTo(pG8) ; group:AddTail(line) ; end if letter == 118 then line:AppendPoint(pA8) ; line:LineTo(pD0) ; line:LineTo(pG8) ; group:AddTail(line) ; end if letter == 119 then line:AppendPoint(pA8) ; line:LineTo(pB0) ; line:LineTo(pD4) ; line:LineTo(pF0) ; line:LineTo(pG8) ; group:AddTail(line) ; end if letter == 120 then line:AppendPoint(pA0) ; line:LineTo(pG8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pA8) ; line:LineTo(pG0) ; group:AddTail(line) ; end if letter == 121 then line:AppendPoint(pA8) ; line:LineTo(pD4) ; line:LineTo(pG8) ; group:AddTail(line) ; line = Contour(0.0) ; line:AppendPoint(pD0) ; line:LineTo(pD4) ; group:AddTail(line) ; end if letter == 122 then line:AppendPoint(pA8) ; line:LineTo(pG8) ; line:LineTo(pA0) ; line:LineTo(pG0) ; group:AddTail(line) ; end -- End of Lower Case if letter == 123 then line:AppendPoint(pD0) ; line:LineTo(pC0) ; line:LineTo(pB1) ; line:LineTo(pB2) ; line:LineTo(pC3) ; line:LineTo(pA4) ; line:LineTo(pC5) ; line:LineTo(pB6) ; line:LineTo(pB7) ; line:LineTo(pC8) ; line:LineTo(pD8) ; group:AddTail(line) ; end if letter == 124 then line:AppendPoint(pA0) ; line:LineTo(pA10) ; line:LineTo(pC10) ; line:LineTo(pC0) ; line:LineTo(pA0) ; group:AddTail(line) ; end if letter == 125 then line:AppendPoint(pD0) ; line:LineTo(pE0) ; line:LineTo(pF1) ; line:LineTo(pF2) ; line:LineTo(pE3) ; line:LineTo(pG4) ; line:LineTo(pE5) ; line:LineTo(pF6) ; line:LineTo(pF7) ; line:LineTo(pE8) ; line:LineTo(pD8) ; group:AddTail(line) ; end if letter == 126 then line:AppendPoint(pA2) ; line:LineTo(pA3) ; line:LineTo(pB5) ; line:LineTo(pF3) ; line:LineTo(pG5) ; line:LineTo(pG4) ; line:LineTo(pF2) ; line:LineTo(pB4) ; line:LineTo(pA2) ; group:AddTail(line) ; end return pH0 end -- function end -- ========================================================================= local function AddGroupToJob(job, group, layer_name) -- create a CadObject to represent the group local cad_object = CreateCadGroup(group); -- create a layer with passed name if it doesnt already exist local layer = job.LayerManager:GetLayerWithName(layer_name) -- and add our object to it layer:AddObject(cad_object, true) return cad_object end -- end function -- ========================================================================= local job = VectricJob() if not job.Exists then DisplayMessageBox("Error: Not finding a job loaded") return false end local strlen = string.len(what) local strup = what local x = strlen local i = 1 local y = "" local ptx = where group = ContourGroup(true) while i <= x do y = string.byte(string.sub(strup, i, i)) if (y >= 97) and (y <= 122) then -- Lower case ptx = MonoFont(job, ptx, y, (size * 0.75), lay, ang) ptx = Polar2D(ptx, ang, size * 0.05) else -- Upper case ptx = MonoFont(job, ptx, y, size, lay, ang) ptx = Polar2D(ptx, ang, size * 0.07) end i = i + 1 end -- while end; AddGroupToJob(job, group, lay) job:Refresh2DView() return true end -- function end
Holer - Draws two Holes and groups them
Draws circles based on a layout.
function Holer(pt, ang, dst, dia, lay) local job = VectricJob() if not job.Exists then DisplayMessageBox("Error: No job loaded") return false end --Caller: Holer(ptx, anx, BaseDim.HoleSpace, Milling.ShelfPinRadius, Milling.LNSideShelfPinDrill .. "-Base") local function AddGroupToJob(job, group, layer_name) local cad_object = CreateCadGroup(group); local layer = job.LayerManager:GetLayerWithName(layer_name) layer:AddObject(cad_object, true) return cad_object end local group = ContourGroup(true) group:AddTail(CreateCircle(pt.x, pt.y, dia, 0.0, 0.0)) pt = Polar2D(pt, ang, dst) group:AddTail(CreateCircle(pt.x, pt.y, dia, 0.0, 0.0)) AddGroupToJob(job, group, lay) return true end -- function end
Data Export Tools
This object is a name-value pair that represents a Document Variable within a VectricJob.
LogWriter
Writes a Log items to the log file.
function LogWriter(LogName, xText) -- Adds a new xText Line to a app log file -- local LogName = Door.CSVPath .. "\\" .. Door.RuntimeLog .. ".txt" local fileW = io.open(LogName, "a") if fileW then fileW:write(xText .. "\n") fileW:close() end -- if end Maindialog:UpdateLabelField("Door.Alert", "Note: Errors are logged in the CSF file folder.") return true end -- function end
Write_CSV
Writes the values to a csv format file.
function Write_CSV(xFilename) -- Writes the values to a csv format file -- Usage: Write_CSV("C:\\Path\\MyName.csv") -- Door.CSVPath = dialog:GetTextField("DoorCSVPath") -- local filename = Path .. "\\" .. Name .. ".csv" local filename = xFilename local file = io.open(filename, "w") if file then -- if the file was opened file:write("Count,Height,Width\n") -- Header Line if Door.Unit then file:write("1,110,595\n"); file:write("1,150,75\n"); file:write("1,175,395\n"); file:write("1,140,495\n") file:write("1,175,445\n"); file:write("1,175,595\n"); file:write("2,200,100\n"); file:write("3,250,125\n") file:write("1,300,150\n"); file:write("2,350,175\n"); file:write("3,400,200\n"); file:write("1,450,225\n") file:write("2,500,250\n"); file:write("3,550,275\n"); file:write("1,600,300\n"); file:write("2,650,325\n") file:write("3,700,350\n"); file:write("1,750,375\n"); file:write("2,800,400\n"); file:write("3,850,425\n"); file:write("1,900,450\n"); file:write("2,950,475\n"); file:write("3,1000,500\n"); file:write("1,1050,525\n"); file:write("2,1100,550\n"); file:write("3,1150,575\n"); file:write("1,1200,600\n"); file:write("2,1250,625\n"); file:write("3,1300,650\n"); file:write("1,1350,675\n"); file:write("2,1400,700\n"); file:write("3,1450,725\n"); file:write("1,1500,750\n"); file:write("2,1550,775\n"); file:write("3,1600,800\n"); file:write("1,1650,825\n"); file:write("2,1700,850\n"); file:write("3,1750,875\n"); file:write("1,1800,900\n"); file:write("2,1850,925\n"); file:write("3,1900,950\n"); file:write("1,1950,975\n"); file:write("2,2000,1000\n"); file:write("3,2050,1025\n"); file:write("1,2100,1050\n"); file:write("2,2150,1075\n"); file:write("3,2200,1100\n"); file:write("1,2250,1125\n"); file:write("2,2300,1150\n"); file:write("3,2350,1175\n"); file:write("1,2400,1200\n"); file:write("2,2450,1225\n") else file:write("1,04.5000,23.2500\n"); file:write("1,06.0000,03.3125\n"); file:write("1,06.5000,15.5000\n"); file:write("1,05.3750,19.5000\n"); file:write("1,07.1875,17.5000\n"); file:write("1,06.1875,23.5000\n"); file:write("2,07.8750,03.8750\n"); file:write("3,09.8750,05.0000\n"); file:write("1,11.7500,05.8750\n"); file:write("2,13.7500,06.6750\n"); file:write("3,15.7500,07.8750\n"); file:write("1,17.1250,08.8250\n"); file:write("2,19.5000,09.5000\n"); file:write("3,21.1250,10.3750\n"); file:write("1,23.6250,11.1250\n"); file:write("2,25.5000,12.1250\n"); file:write("3,27.6250,13.7500\n"); file:write("1,29.5000,14.7500\n"); file:write("2,31.4375,15.7500\n"); file:write("3,33.4375,16.7500\n"); file:write("1,35.4375,17.7500\n"); file:write("2,37.4375,18.6250\n"); file:write("3,39.3750,19.6250\n"); file:write("1,41.3750,20.6250\n"); file:write("2,43.3750,21.6250\n"); file:write("3,45.1875,22.6250\n"); file:write("1,47.2500,23.6250\n"); file:write("2,49.1875,24.6250\n"); file:write("3,51.1250,25.5000\n"); file:write("1,53.1250,26.5000\n"); file:write("2,55.1250,27.5000\n"); file:write("3,57.1250,28.5000\n"); file:write("1,59.1250,29.5000\n"); file:write("2,61.2500,30.5000\n"); file:write("3,62.9375,31.4375\n"); file:write("1,64.9375,32.4375\n"); file:write("2,66.9375,33.4375\n"); file:write("3,68.8125,34.4375\n"); file:write("1,70.8750,35.3750\n"); file:write("2,72.9375,36.4375\n"); file:write("3,74.8750,37.4375\n"); file:write("1,76.9375,38.3750\n"); file:write("2,78.7500,39.3750\n"); file:write("3,80.7500,40.3750\n"); file:write("1,82.6250,41.3750\n"); file:write("2,84.6250,42.3750\n"); file:write("3,86.6250,43.3750\n"); file:write("1,88.5000,44.2500\n"); file:write("2,90.6250,45.2500\n"); file:write("3,92.6250,46.2500\n"); file:write("1,94.4375,47.2500\n"); file:write("2,95.4375,48.2500\n") end -- if end file:close() -- closes the open file end -- if end return true end -- function end
Text File Tools
This object is a name-value pair that represents a Document Variable within a VectricJob.
LengthOfFile
Returns file line count
function LengthOfFile(filename) Returns: number]] local len = 0 if FileExists(filename) then local file = io.open(filename) if file then for _ in file:lines() do len = len + 1 end file:close() end -- if end end return len end -- function end
NameValidater - Checks File Name for Valid Chars
Returns file line count
function NameValidater(FileName) local MyTrue = true local strlen = string.len(FileName) local strup = string.upper(FileName) local i = 1 local y = "" while i <= strlen do y = string.byte(string.sub(strup, i, i)) if y == 32 then -- Space MyTrue = false break elseif y == 45 then -- Dash MyTrue = false break elseif y == 127 then -- Delete MyTrue = false break elseif y == 126 then -- Delete MyTrue = false break elseif y == 123 then -- Open brace MyTrue = false break elseif y == 124 then -- Pipe MyTrue = false break elseif y == 125 then -- Close brace MyTrue = false break elseif -- Illegal Filename Characters (y == 33) or -- ! Exclamation mark (y == 34) or -- " Double Quotes (y == 35) or -- # Hash (y == 36) or -- $ Dollar (y == 37) or -- % Percent (y == 38) or -- & Ampersand (y == 39) or -- ' Apostrophe (y == 42) or -- * Asterisk (y == 43) or -- + Plus (y == 44) or -- , Comma (y == 47) or -- / Slash (y == 58) or -- : Colon (y == 59) or -- ; Semi-colon (y == 60) or -- < Less than (y == 62) or -- > Greater than (y == 63) or -- ? Question mark (y == 64) or -- @ At (y == 92) or -- \ Backslash (y == 96) or -- ` Single Quotes (y == 123) or -- { Open brace (y == 124) or -- | Pipe (y == 125) -- } Close brace then MyTrue = false break elseif (y <= 31) then -- Control Codes MyTrue = false break elseif (y >= 48) and (y <= 57) then -- Numbers MyTrue = false break elseif (y >= 65) and (y <= 90) then -- Uppercase A to Z MyTrue = false break elseif (y >= 97) and (y <= 122) then -- Lowercase A to Z MyTrue = false break elseif (y >= 65) and (y <= 90) then -- Uppercase A to Z MyTrue = false break end -- if end i = i + 1 end -- while end; return MyTrue end -- function end
CopyFileFromTo
Copy Old File to Newfile
function CopyFileFromTo(OldFile, NewFile) if FileExists(NewFile) then DisplayMessageBox("File copy " .. File .. " failed. \n\nFile found at: " .. NewFile .. "\n" ) return false elseif not FileExists(OldFile) then DisplayMessageBox("File copy of " .. File .. " failed. \n\nFile not found at: " .. OldFile .. "\n" ) return false else local fileR = io.open(OldFile) -- reader file local fileW = io.open(NewFile, "w") -- writer file if fileR and fileW then -- if both files are open for Line in fileR:lines() do fileW:write(Line .. "\n") end -- for end end if fileR then fileR:close() end if fileW then fileW:close() end return true end -- for end end -- function end
ValidateName
Returns True if the file name is safe to use
function ValidateName(FileName) local MyTrue = true local strlen = string.len(FileName) local strup = string.upper(FileName) local i = 1 local y = "" while i <= strlen do y = string.byte(string.sub(strup, i, i)) if y == 32 then -- Space MyTrue = true elseif y == 45 then -- hyphn MyTrue = true elseif (y >= 48) and (y <= 57) then -- numbers MyTrue = true elseif (y >= 65) and (y <= 90) then -- Uppercase MyTrue = true else MyTrue = false break end -- if end i = i + 1 end -- while end return MyTrue end -- function end
FileExists
Returns True if file is found
function FileExists(name) -- call = ans = FileExists("sample.txt") local f=io.open(name,"r") if f~=nil then io.close(f) return true else io.close(f) return false end end -- function end
FileAccess
Returns true if file is available for update.
function FileAccess(FileName) if (not(os.rename(FileName, FileName))) then StatusMessage("Error", FileName, "The Gadget cannot access the ".. FileName .. " The OS has blocked write access. " .. "Verify the full path is correct and No application has the file open. ", "(1405)") return false else return true end -- if end end -- function end
IsDir
Returns true if path is found
function IsDir(path) -- local function exists(file) local ok, err, code = os.rename(file, file) if not ok then if code == 13 then return true end end return ok, err end return exists(path.."/") end -- function end
Sheetlabel
Returns file line count of a txt (assic) file
function Sheetlabel(Wpt, xTextHeight, xThickness, xType, YY) -- Constructs sheet label local pt1Text = Point2D() local Pang = 0.0 local Tang = 0.0 if YY then pt1Text = Polar2D(Polar2D(Wpt, 90.0, YY), 90.0, 6.0 * JimAndi.Cal) Pang = 270.0 Tang = 0.0 else if Material.Orientation == "V" then pt1Text = Polar2D(Wpt, 90.0, Milling.MaterialBlockWidth + (4.0 * JimAndi.Cal)) else pt1Text = Polar2D(Wpt, 90.0, Milling.MaterialBlockHeight + (4.0 * JimAndi.Cal)) end Pang = 270.0 Tang = 0.0 end DrawWriter(Project.ProgramName, pt1Text, Milling.TextHeight * 3.0, JimAndi.LNDrawNotes, Tang) pt1Text = Polar2D(pt1Text, Pang, Milling.TextHeight * 3.35) DrawWriter("Cabinet ID: " .. Project.DrawerID, pt1Text, JimAndi.TextHeight * 2.0, JimAndi.LNDrawNotes, Tang) pt1Text = Polar2D(pt1Text, Pang, Milling.TextHeight * 2.75) DrawWriter("Cabinet Name: " .. Project.CabinetName, pt1Text, JimAndi.TextHeight * 2.0, JimAndi.LNDrawNotes, Tang) pt1Text = Polar2D(pt1Text, Pang, Milling.TextHeight * 2.75) if xThickness then DrawWriter("Material: " .. xThickness .. " " .. xType, pt1Text, JimAndi.TextHeight * 2.0, JimAndi.LNDrawNotes, Tang) end -- if end end -- function end
DiskRights
Returns true if you have write access to path.
function DiskRights(path) -- local xx = io.open(path, "w") if xx == nil then io.close() return false else xx:close() return true end end -- function end
Geometry Tools
This object is a name-value pair that represents a Document Variable within a VectricJob.
SheetNew
Adds a new sheet to the drawing
function SheetNew() -- Adds a new sheet to the drawing if GetVersion() >= 10.5 then then local layer_manager = Milling.job.LayerManager -- get current sheet count - note sheet 0 the default sheet counts as one sheet local orig_num_sheets = layer_manager.NumberOfSheets -- get current active sheet index local orig_active_sheet_index = layer_manager.ActiveSheetIndex -- set active sheet to last sheet local num_sheets = layer_manager.NumberOfSheets layer_manager.ActiveSheetIndex = num_sheets - 1 -- Add a new sheet layer_manager:AddNewSheet() -- set active sheet to last sheet we just added num_sheets = layer_manager.NumberOfSheets layer_manager.ActiveSheetIndex = num_sheets - 1 Milling.job:Refresh2DView() end -- if end return true end
GetDiameterAndCentre
function GetDiameterAndCentre(cadcontour, point2d) local contour = cadcontour:GetContour() local arc = contour:GetFirstSpan() local point3d = Point3D(); arc = CastSpanToArcSpan(arc) local diameter = arc:RadiusAndCentre(point3d) * 2.0 point2d = Point2D(point3d.x, point3d.y) -- MessageBox("Diameter = " .. diameter) return diameter, point2d end
IsCircle
function IsCircle(cadcontour) -- Returns True if conture is a circle local contour = cadcontour:GetContour() -- Does it consist only of arcs? if contour.ContainsBeziers then return false end if not contour.ContainsArcs then return false end -- Does is contain 4 contours? if contour.Count ~= 4 then return false end -- Check the arcs end and initial points make a square. local arcs = {} local count = 1; local pos = contour:GetHeadPosition() local object while pos ~= nil do object, pos = contour:GetNext(pos) arcs[count] = object count = count + 1 end local x_1 =(arcs[1]).StartPoint2D.x local y_1 =(arcs[1]).StartPoint2D.y local x_3 =(arcs[3]).StartPoint2D.x local y_3 =(arcs[3]).StartPoint2D.y local x_2 =(arcs[2]).StartPoint2D.x local y_2 =(arcs[2]).StartPoint2D.y local x_4 =(arcs[4]).StartPoint2D.x local y_4 =(arcs[4]).StartPoint2D.y local horizontal_distance = (x_1 - x_3)*(x_1 - x_3) + (y_1 - y_3)*(y_1 - y_3) local vertical_distance = (x_4 - x_2)*(x_4 - x_2) + (y_2 - y_4)*(y_2 - y_4) if math.abs(horizontal_distance - vertical_distance) > 0.04 then return false end -- Check the bulge factor is 90 local bulge = 0; for _, arc_span in ipairs(arcs) do bulge = CastSpanToArcSpan(arc_span).Bulge; if math.abs(math.abs(bulge) - g_bulge90) > 0.04 then return false end end return true end
SheetSet
function SheetSet(Name) -- Move focus to a named sheet local job = VectricJob() local sheet_manager = job.SheetManager local sheet_ids = sheet_manager:GetSheetIds() for id in sheet_ids do if(sheet_manager:GetSheetName(id) == Name) then sheet_manager.ActiveSheetId = id end end end
SheetNextSize
function SheetNextSize(X, Y) -- Make New Sheet to size (x, y) if X == nil then X = Milling.MaterialBlockWidth else X = X + (2 * Milling.Cal) end if Y == nil then Y = Milling.MaterialBlockHeight else Y = Y + (2 * Milling.Cal) end Milling.Sheet = Milling.Sheet + 1 local sheet_manager = Milling.job.SheetManager local sheet_ids = sheet_manager:GetSheetIds() for id in sheet_ids do if(sheet_manager:GetSheetName(id) == "Sheet 1") then sheet_manager:CreateSheets(1, id, Box2D(Point2D(0, 0), Point2D(X, Y))) end end SheetSet("Sheet " .. tostring(Milling.Sheet)) return true end
GetPolarAngle
function GetPolarAngle(Start, Corner, End) -- Returns the Polar Angle local function GetPolarDirection(point1, point2) local ang = math.abs(math.deg(math.atan((point2.Y - point1.Y) / (point2.X - point1.X)))) if point1.X < point2.X then if point1.Y < point2.Y then ang = ang + 0.0 else ang = 360.0 - ang end -- if end else if point1.Y < point2.Y then ang = 180.0 - ang else ang = ang + 180.0 end -- if end end -- if end if ang >=360 then ang = ang -360.0 end -- if end return ang end -- function end return math.abs(GetPolarDirection(Corner, Start) - GetPolarDirection(Corner, End)) end -- function end
GetOrientation
function GetOrientation(point1, point2) -- Orientation of left, right, up or down if DecimalPlaces(point1.X,8) == DecimalPlaces(point2.X,8) then if point1.Y < point2.Y then return 90.0 else return 270.0 end elseif DecimalPlaces(point1.Y,8) == DecimalPlaces(point2.Y,8) then if point1.X < point2.X then return 0.0 else return 180.0 end else return nil end end -- function end
GetPolarDirection
function GetPolarDirection(point1, point2) -- Retuens and amgle from two points local ang = math.abs(math.deg(math.atan((point2.Y - point1.Y) / (point2.X - point1.X)))) if point1.X < point2.X then if point1.Y < point2.Y then ang = ang + 0.0 else ang = 360.0 - ang end -- if end else if point1.Y < point2.Y then ang = 180.0 - ang else ang = ang + 180.0 end -- if end end -- if end if ang >=360 then ang = ang -360.0 end -- if end return ang end -- function end
CenterArc
function CenterArc(A, B, RadiusD) -- Returns 2DPoint from Arc point and Radius local radius = ((tonumber(RadiusD) or 0) * g_var.scl) local horda = (A - B).Length if math.abs(radius) < (horda / 2) and radius ~= 0 then --D("Too small radius " .. radius .. "\nreplaced by the smallest possible " .. (horda / 2)) radius = (horda / 2) end return Point2D(((A.x + B.x) / 2 + (B.y - A.y) * math.sqrt(math.abs(radius) ^ 2 - (horda / 2) ^ 2) / horda), ((A.y + B.y) / 2 + (A.x - B.x) * math.sqrt(math.abs(radius) ^ 2 - (horda / 2) ^ 2) / horda)) end -- function end
Polar2D
The Polar2D function will calculate a new point in space based on a Point of reference, Angle of direction, and Projected distance. Returns 2DPoint from Known Point, Angle direction, and Projected distance.
function Polar2D(pt, ang, dis) -- The Polar2D function will calculate a new point in space based on a Point of reference, Angle of direction, and Projected distance. -- ::''Returns a 2Dpoint(x, y)'' return Point2D((pt.X + dis * math.cos(math.rad(ang))), (pt.Y + dis * math.sin(math.rad(ang)))) end -- End Function
GetDistance
Returns Double from two Points
function GetDistance(objA, objB) -- Returns Double from two Points local xDist = objB.x - objA.x local yDist = objB.y - objA.y return math.sqrt((xDist ^ 2) + (yDist ^ 2)) end -- function end
GetAngle
-- ===========================================================]] function GetAngle(point1, point2) local ang = math.abs(math.deg(math.atan((point2.Y - point1.Y) / (point2.X - point1.X)))) if point1.X < point2.X then if point1.Y < point2.Y then ang = ang + 0.0 else ang = 360.0 - ang end -- if end else if point1.Y < point2.Y then ang = 180.0 - ang else ang = ang + 180.0 end -- if end end -- if end if ang >=360.0 then ang = ang -360.0 end -- if end return ang
end -- function end</nowiki>
Arc2Bulge
-- ===========================================================]] function Arc2Bulge(p1, p2, Rad) -- Returns the Bulge factor for an arc local chord = math.sqrt(((p2.x - p1.x) ^ 2) + ((p2.y - p1.y) ^ 2)) local seg = (Rad - (0.5 * (math.sqrt((4.0 * Rad^2) - chord^2)))) local bulge = (2 * seg) / chord return bulge
end -- function end</nowiki>
TrigIt
Calculates Right Angle
function TrigIt() -- Calculates Right Angle -- ==Trig Function== -- VECTRIC LUA SCRIPT -- =====================================================]] -- Gadgets are an entirely optional add-in to Vectric's core software products. -- They are provided 'as-is', without any express or implied warranty, and you -- make use of them entirely at your own risk. -- In no event will the author(s) or Vectric Ltd. be held liable for any damages -- arising from their use. -- Permission is granted to anyone to use this software for any purpose, -- including commercial applications, and to alter it and redistribute it freely, -- subject to the following restrictions: -- 1. The origin of this software must not be misrepresented; you must not -- claim that you wrote the original software. -- 2. If you use this software in a product, an acknowledgement in the product -- documentation would be appreciated but is not required. -- 3. Altered source versions must be plainly marked as such, and must not be -- misrepresented as being the original software. -- 4. This notice may not be removed or altered from any source distribution. -- -- Right Triangle TrigFunction is written by Jim Anderson of Houston Texas 2020 -- =====================================================]] -- Code Debugger -- require("mobdebug").start() -- =====================================================]] -- Global Variables -- Trig = {} -- =====================================================]] function TrigTest() -- Test the All Right Angle TrigClear() Trig.A = 0.0 Trig.B = 0.0 Trig.C = 90.0 Trig.Opp = 3.0 -- Rise or (B2C) Trig.Adj = 4.0 -- Base or (A2C) Trig.Hyp = 0.0 -- Slope or (A2B) Trig.Slope = 0.0 Trig.Area = 0.0 Trig.OutRadius = 0.0 Trig.InRadius = 0.0 Trig.Parameter = 0.0 TrigIt() DisplayMessageBox("Test 1: \n" .. " Trig.A = " .. tostring(Trig.A) .. " \n" .. " Trig.B = " .. tostring(Trig.B) .. " \n" .. " Trig.C = " .. tostring(Trig.C) .. " \n" .. " Trig.Opp = * " .. tostring(Trig.Opp) .. " \n" .. " Trig.Adj = * " .. tostring(Trig.Adj) .. " \n" .. " Trig.Hyp = " .. tostring(Trig.Hyp) .. " \n" .. " Trig.Slope = " .. tostring(Trig.Slope) .. " \n" .. " Trig.Area = " .. tostring(Trig.Area) .. " \n" .. " Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. " Trig.OutRadius = " .. tostring(Trig.OutRadius) .. " \n" .. " Trig.InRadius = " .. tostring(Trig.InRadius) .. " \n" ) -- =====================================================]] TrigClear() Trig.A = 0.0 Trig.B = 0.0 Trig.C = 90.0 Trig.Opp = 0.0 -- Rise or (B2C) Trig.Adj = 4.0 -- Base or (A2C) Trig.Hyp = 5.0 -- Slope or (A2B) Trig.Slope = 0.0 Trig.Area = 0.0 Trig.OutRadius = 0.0 Trig.InRadius = 0.0 Trig.Parameter = 0.0 TrigIt() DisplayMessageBox("Test 2: \n" .. " Trig.A = " .. tostring(Trig.A) .. " \n" .. " Trig.B = " .. tostring(Trig.B) .. " \n" .. " Trig.C = " .. tostring(Trig.C) .. " \n" .. " Trig.Opp = * " .. tostring(Trig.Opp) .. " \n" .. " Trig.Adj = * " .. tostring(Trig.Adj) .. " \n" .. " Trig.Hyp = " .. tostring(Trig.Hyp) .. " \n" .. " Trig.Slope = " .. tostring(Trig.Slope) .. " \n" .. " Trig.Area = " .. tostring(Trig.Area) .. " \n" .. " Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. " Trig.OutRadius = " .. tostring(Trig.OutRadius) .. " \n" .. " Trig.InRadius = " .. tostring(Trig.InRadius) .. " \n" ) -- =====================================================]] TrigClear() Trig.A = 0.0 Trig.B = 0.0 Trig.C = 90.0 Trig.Opp = 3.0 -- Rise or (B2C) Trig.Adj = 0.0 -- Base or (A2C) Trig.Hyp = 5.0 -- Slope or (A2B) Trig.Slope = 0.0 Trig.Area = 0.0 Trig.OutRadius = 0.0 Trig.InRadius = 0.0 Trig.Parameter = 0.0 TrigIt() DisplayMessageBox("Test 3: \n" .. " Trig.A = " .. tostring(Trig.A) .. " \n" .. " Trig.B = " .. tostring(Trig.B) .. " \n" .. " Trig.C = " .. tostring(Trig.C) .. " \n" .. " Trig.Opp = * " .. tostring(Trig.Opp) .. " \n" .. " Trig.Adj = " .. tostring(Trig.Adj) .. " \n" .. " Trig.Hyp = * " .. tostring(Trig.Hyp) .. " \n" .. " Trig.Slope = " .. tostring(Trig.Slope) .. " on 12 inch \n" .. " Trig.Area = " .. tostring(Trig.Area) .. " \n" .. " Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. " Trig.OutRadius = " .. tostring(Trig.OutRadius) .. " \n" .. " Trig.InRadius = " .. tostring(Trig.InRadius) .. " \n" ) -- =====================================================]] TrigClear() Trig.A = 36.86897645844 Trig.B = 0.0 Trig.C = 90.0 Trig.Opp = 3.0 -- Rise or (B2C) Trig.Adj = 0.0 -- Base or (A2C) Trig.Hyp = 0.0 -- Slope or (A2B) Trig.Slope = 0.0 Trig.Area = 0.0 Trig.OutRadius = 0.0 Trig.InRadius = 0.0 Trig.Parameter = 0.0 TrigIt() DisplayMessageBox("Test 4: \n" .. " Trig.A = * " .. tostring(Trig.A) .. " \n" .. " Trig.B = " .. tostring(Trig.B) .. " \n" .. " Trig.C = " .. tostring(Trig.C) .. " \n" .. " Trig.Opp = * " .. tostring(Trig.Opp) .. " \n" .. " Trig.Adj = " .. tostring(Trig.Adj) .. " \n" .. " Trig.Hyp = " .. tostring(Trig.Hyp) .. " \n" .. " Trig.Slope = " .. tostring(Trig.Slope) .. " on 12 inch \n" .. " Trig.Area = " .. tostring(Trig.Area) .. " \n" .. " Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. " Trig.OutRadius = " .. tostring(Trig.OutRadius) .. " \n" .. " Trig.InRadius = " .. tostring(Trig.InRadius) .. " \n" ) -- =====================================================]] TrigClear() Trig.A = 36.86897645844 Trig.B = 0.0 Trig.C = 90.0 Trig.Opp = 0.0 -- Rise or (B2C) Trig.Adj = 4.0 -- Base or (A2C) Trig.Hyp = 0.0 -- Slope or (A2B) Trig.Slope = 0.0 Trig.Area = 0.0 Trig.OutRadius = 0.0 Trig.InRadius = 0.0 Trig.Parameter = 0.0 TrigIt() DisplayMessageBox("Test 5: \n" .. " Trig.A = * " .. tostring(Trig.A) .. " \n" .. " Trig.B = " .. tostring(Trig.B) .. " \n" .. " Trig.C = " .. tostring(Trig.C) .. " \n" .. " Trig.Opp = " .. tostring(Trig.Opp) .. " \n" .. " Trig.Adj = * " .. tostring(Trig.Adj) .. " \n" .. " Trig.Hyp = " .. tostring(Trig.Hyp) .. " \n" .. " Trig.Slope = " .. tostring(Trig.Slope) .. " on 12 inch \n" .. " Trig.Area = " .. tostring(Trig.Area) .. " \n" .. " Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. " Trig.OutRadius = " .. tostring(Trig.OutRadius) .. " \n" .. " Trig.InRadius = " .. tostring(Trig.InRadius) .. " \n" ) -- =====================================================]] TrigClear() Trig.A = 36.86897645844 Trig.B = 0.0 Trig.C = 90.0 Trig.Opp = 0.0 -- Rise or (B2C) Trig.Adj = 0.0 -- Base or (A2C) Trig.Hyp = 5.0 -- Slope or (A2B) Trig.Slope = 0.0 Trig.Area = 0.0 Trig.OutRadius = 0.0 Trig.InRadius = 0.0 Trig.Parameter = 0.0 TrigIt() DisplayMessageBox("Test 6: \n" .. " Trig.A = * " .. tostring(Trig.A) .. " \n" .. " Trig.B = " .. tostring(Trig.B) .. " \n" .. " Trig.C = " .. tostring(Trig.C) .. " \n" .. " Trig.Opp = " .. tostring(Trig.Opp) .. " \n" .. " Trig.Adj = " .. tostring(Trig.Adj) .. " \n" .. " Trig.Hyp = * " .. tostring(Trig.Hyp) .. " \n" .. " Trig.Slope = " .. tostring(Trig.Slope) .. " on 12 inch \n" .. " Trig.Area = " .. tostring(Trig.Area) .. " \n" .. " Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. " Trig.OutRadius = " .. tostring(Trig.OutRadius) .. " \n" .. " Trig.InRadius = " .. tostring(Trig.InRadius) .. " \n" ) TrigClear() Trig.A = 0.0 Trig.B = 0.0 Trig.C = 90.0 Trig.Opp = 3.0 -- Rise or (B2C) Trig.Adj = 0.0 -- Base or (A2C) Trig.Hyp = 0.0 -- Slope or (A2B) Trig.Slope = 9.0 Trig.Area = 0.0 Trig.OutRadius = 0.0 Trig.InRadius = 0.0 Trig.Parameter = 0.0 TrigIt() DisplayMessageBox("Test 7: \n" .. " Trig.A = " .. tostring(Trig.A) .. " \n" .. " Trig.B = " .. tostring(Trig.B) .. " \n" .. " Trig.C = " .. tostring(Trig.C) .. " \n" .. " Trig.Opp = * " .. tostring(Trig.Opp) .. " \n" .. " Trig.Adj = " .. tostring(Trig.Adj) .. " \n" .. " Trig.Hyp = " .. tostring(Trig.Hyp) .. " \n" .. " Trig.Slope = * " .. tostring(Trig.Slope) .. " on 12 inch \n" .. " Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. " Trig.Area = " .. tostring(Trig.Area) .. " \n" .. " Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. " Trig.Circumscribing = " .. tostring(Trig.Circumscribing) .. " \n" .. " Trig.Inscribing = " .. tostring(Trig.Inscribing) .. " \n" ) -- =====================================================]] TrigClear() Trig.A = 0.0 Trig.B = 0.0 Trig.C = 90.0 Trig.Opp = 0.0 -- Rise or (B2C) Trig.Adj = 0.0 -- Base or (A2C) Trig.Hyp = 0.0 -- Slope or (A2B) Trig.Slope = 9.0 Trig.Area = 0.0 Trig.OutRadius = 0.0 Trig.InRadius = 0.0 Trig.Parameter = 0.0 TrigIt() DisplayMessageBox("Test Error: \n" .. " Trig.A = " .. tostring(Trig.A) .. " \n" .. " Trig.B = " .. tostring(Trig.B) .. " \n" .. " Trig.C = " .. tostring(Trig.C) .. " \n" .. " Trig.Opp = * " .. tostring(Trig.Opp) .. " \n" .. " Trig.Adj = " .. tostring(Trig.Adj) .. " \n" .. " Trig.Hyp = " .. tostring(Trig.Hyp) .. " \n" .. " Trig.Slope = * " .. tostring(Trig.Slope) .. " on 12 inch \n" .. " Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. " Trig.Area = " .. tostring(Trig.Area) .. " \n" .. " Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. " Trig.Circumscribing = " .. tostring(Trig.Circumscribing) .. " \n" .. " Trig.Inscribing = " .. tostring(Trig.Inscribing) .. " \n" ) return true end -- function end -- -- =====================================================]] function TrigClear() -- Clears and resets Trig Table Trig.A = 0.0 Trig.B = 0.0 Trig.C = 90.0 Trig.Opp = 0.0 -- Rise or (B2C) Trig.Adj = 0.0 -- Base or (A2C) Trig.Hyp = 0.0 -- Slope or (A2B) Trig.Slope = 0.0 return true end -- function end -- =====================================================]] local function BSA() Trig.B = (Trig.C - Trig.A) Trig.Slope = math.tan(math.rad(Trig.A)) * 12.0 Trig.Area = (Trig.Opp * Trig.Adj) * 0.5 Trig.Inscribing = ((Trig.Opp + Trig.Adj) - Trig.Hyp) * 0.5 Trig.Circumscribing = Trig.Hyp * 0.5 Trig.Parameter = Trig.Opp + Trig.Adj + Trig.Hyp end if Trig.A == 0.0 and Trig.B > 0.0 and Trig.Slope == 0.0 then Trig.A = Trig.C - Trig.B elseif Trig.A == 0.0 and Trig.B == 0.0 and Trig.Slope > 0.0 then Trig.A = math.deg(math.atan(Trig.Slope / 12.0)) end -- if end -- test 4 if (Trig.A > 0.0) and (Trig.Opp > 0.0) then -- A and Rise or (B2C) Trig.Adj = Trig.Opp / (math.tan(math.rad(Trig.A))) Trig.Hyp = math.sqrt((Trig.Opp * Trig.Opp ) + ( Trig.Adj * Trig.Adj)) BSA() return true -- test 6 elseif (Trig.A > 0.0) and (Trig.Hyp > 0.0) then -- A and Slope or (A2B) Trig.Adj = math.cos(math.rad(Trig.A)) * Trig.Hyp Trig.Opp = math.sqrt((Trig.Hyp * Trig.Hyp ) - ( Trig.Adj * Trig.Adj)) BSA() return true -- test 5 elseif (Trig.A > 0.0) and (Trig.Adj > 0.0) then -- A and Base or (A2C) Trig.Opp = math.tan(math.rad(Trig.A)) * Trig.Adj Trig.Hyp = math.sqrt((Trig.Opp * Trig.Opp ) + ( Trig.Adj * Trig.Adj)) BSA() return true -- test 1 elseif (Trig.Opp > 0.0) and (Trig.Adj > 0.0) then -- Rise and Base Trig.Hyp = math.sqrt((Trig.Opp * Trig.Opp ) + ( Trig.Adj * Trig.Adj)) Trig.A = math.deg(math.atan(Trig.Opp / Trig.Adj)) BSA() return true elseif (Trig.Adj > 0.0) and (Trig.Hyp > 0.0) then -- Rise and Slope -- test 2 Trig.Opp = math.sqrt((Trig.Hyp * Trig.Hyp ) - ( Trig.Adj * Trig.Adj)) Trig.A = math.deg(math.atan(Trig.Opp / Trig.Adj)) BSA() return true elseif (Trig.Opp > 0.0) and (Trig.Hyp > 0.0) then -- Base and Slope -- test 3 Trig.Adj = math.sqrt((Trig.Hyp * Trig.Hyp ) - ( Trig.Opp * Trig.Opp)) Trig.A = math.deg(math.atan(Trig.Opp / Trig.Adj)) BSA() return true else DisplayMessageBox("Error: Trig Values did not match requirements: \n" .. " Trig.A = " .. tostring(Trig.A) .. " \n" .. " Trig.B = " .. tostring(Trig.B) .. " \n" .. " Trig.C = " .. tostring(Trig.C) .. " \n" .. " Trig.Opp = " .. tostring(Trig.Opp) .. " \n" .. " Trig.Adj = " .. tostring(Trig.Adj) .. " \n" .. " Trig.Hyp = " .. tostring(Trig.Hyp) .. " \n" .. " Trig.Slope = " .. tostring(Trig.Slope) .. " on 12 inch \n" .. " Trig.Area = " .. tostring(Trig.Area) .. " \n" .. " Trig.Parameter = " .. tostring(Trig.Parameter) .. " \n" .. " Trig.OutRadius = " .. tostring(Trig.OutRadius) .. " \n" .. " Trig.InRadius = " .. tostring(Trig.InRadius) .. " \n" ) return false end end -- function end -- =====================================================]] end -- Geometry Tools end
INI File Tools
These functions manipulate the INI files for the storage and retrieval of data.
INI_NameStrip
Convert string to the correct data type.
Local Words = NameStrip("KPSDFKSPSK - 34598923", "-") -- returns "KPSDFKSPSK"
Source Code
function INI_NameStrip(str, var) if "" == str then DisplayMessageBox("Error in string") else if string.find(str, var) then local j = assert(string.find(str, var) - 1) return All_Trim(string.sub(str, 1, j)) else return str end end end -- function end
INI_HeadStrip
Convert string to the correct data type.
function INI_HeadStrip(str, var) -- convert string to the correct data type -- Local Words = HeadStrip("LastName23 = Smith", "=") -- returns "Smith" if "" == str then DisplayMessageBox("Error in string") else if string.find(str, var) then local j = assert(string.find(str, var) + 1) return All_Trim(string.sub(str, j)) else return str end end end -- function end
INI_AreDupGroups
Checks if there are duplicate groups.
function INI_AreDupGroups(xPath, xFile) local GroupNames = {} local CleanNames = {} local DupGroups = {} GroupNames = INI_ReadGroups(xFile, aName) CleanNames = RemoveDups(GroupNames) if TableLength(GroupNames) == TableLength(CleanNames)then return true else return false end end -- function end
INI_FixDupGroups
Find and fix duplicate groups
function INI_FixDupGroups(xPath, xFile) local GroupNames = {} local CleanNames = {} local DupGroups = {} GroupNames = INI_ReadGroups(xFile, aName) return true end -- function end
INI_DeleteGroup
Deletes only the first find of xGroup
function INI_DeleteGroup(xPath, xFile, xGroup) -- Deletes old ini (.bak) file -- Copy's the .ini to a backup (.bak) new file -- Reads the new backup file and writes a new file to the xGroup value -- Stops Writing lines until next Group is found -- Writes to end of file -- Call: DeleteGroup("C:\\Users\\James\\OneDrive\\Documents\\DoorGadget\\Clients\\Marcin", "ProjectList", "Boston") local OfileName = xPath .. "\\" .. xFile .. ".bak" if FileExists(OfileName) then os.remove(OfileName) end local NfileName = xPath .. "\\" .. xFile .. ".ini" -- os.rename(NfileName, OfileName) -- makes backup copy file if CopyFileFromTo(NfileName, OfileName) then local fileR = io.open(OfileName) local fileW = io.open(NfileName, "w") local groups = false local writit = true local MyTxt = "" local txt = "" if fileR and fileW then -- files are open for Line in fileR:lines() do -- read each line of the backup file txt = Line -- copy line from file to txt if All_Trim(Line) == "[" .. All_Trim(xGroup) .. MyTxt .. "]" then -- look for a match groups = true txt = "" end -- if end if groups and MyTxt == "" then -- if group is true turn off the write function writit = false if "[" == string.sub(All_Trim(txt), 1, 1) then -- turns write function on if next group is found groups = false xGroup = "-" writit = true MyTxt = "--" else writit = false end -- if end end -- if end if writit then fileW:write(txt .. "\n") txt = "" end -- if end end -- for end os.remove(OfileName) end -- if end if fileR then fileR:close() end if fileW then fileW:close() end end return true end -- function end
INI_RenameGroup
Renames a group
function INI_RenameGroup(xOldGroup, xNewGroup) --Deletes old ini Hardware.bak file --Copys the ini file to a backup copy file --Reads the backup file and writes a new ini file to the xGroup --Writes new file with new group to the new ini file local NfileName = Project.AppPath .. "\\" .. "EasyDrawerHardware" .. ".ini" local OfileName = Project.AppPath .. "\\" .. "EasyDrawerHardware" .. ".bak" os.remove(OfileName) CopyFileFromTo(NfileName, OfileName) -- makes backup file local fileR = io.open(OfileName) local fileW = io.open(NfileName, "w") if fileR and fileW then local groups = false local txt = "" for Line in fileR:lines() do if All_Trim(Line) == "[" .. All_Trim(xOldGroup) .. txt .. "]" then -- Group fileW:write(xNewGroup .. "\n") txt = "-" else fileW:write(Line .. "\n") end -- if end end -- for end fileR:close() fileW:close() os.remove(OfileName) end -- if end return true end -- function end
INI_DeleteItem
Deleates a group
function INI_DeleteItem(xPath, xFile, xGroup, xItem) -- Deletes old ini (.bak) file -- Copys the .ini to a backup (.bak) new file -- Reads the new backup file and writes a new file to the xGroup value -- Stops Writing lines until next Group is found -- Writes to end of file -- DeleteGroup("C:\\Users\\James\\OneDrive\\Documents\\DoorGadget\\Clients\\Marcin", "ProjectList", "Boston") local NfileName = xPath .. "\\" .. xFile .. ".ini" local OfileName = xPath .. "\\" .. xFile .. ".bak" os.remove(OfileName) CopyFileFromTo(NfileName, OfileName) -- makes backup copy file local fileR = io.open(OfileName) local fileW = io.open(NfileName, "w") if fileR and fileW then local groups = false local writit = true local txt = "" for Line in fileR:lines() do txt = Line if All_Trim(Line) == "[" .. All_Trim(xGroup) .. "]" then groups = true end -- if end if groups then -- =================== if xItem == string.sub(Line, 1, string.len(xItem)) then -- Item writit = false groups = false end -- if end end -- if end -- =================== if writit then fileW:write(txt .. "\n") end -- if end writit = true end -- for end os.remove(OfileName) fileR:close() fileW:close() end -- if end return true end -- function end
INI_ValidateGroup
Reads INI file and returns true if group is found
function INI_ValidateGroup(xFile, xGroup) -- Reads INI file and returns true if the group is found local fileR = io.open(xFile) local group = false for Line in fileR:lines() do if string.upper(All_Trim(Line)) == "[" .. string.upper(All_Trim(xGroup)) .. "]" then -- Group group = true break end -- if end end -- for end fileR:close() return group end -- function end
INI_ValidateItem
Reads INI file and returns true if group and item is found
function INI_ValidateItem(xFile, xGroup, xItem) local fileR = io.open(xFile) if fileR then local group = false local item = false local ItemLen = string.len(xItem) for Line in fileR:lines() do if All_Trim(Line) == "[" .. string.upper(All_Trim(xGroup)) .. "]" then -- Group group = true end -- if end if group then if string.upper(xItem) == string.upper(string.sub(Line, 1, string.len(xItem))) then -- Item item = true break end -- if end end -- if end end -- for end fileR:close() end -- if end return group end -- function end
INI_StrValue
Reads INI file and returns string value
function INI_StrValue(str, ty) -- Convert string to the correct data type if nil == str then DisplayMessageBox("Error in Ini file - looking for a " .. ty .. " value") else if "" == All_Trim(str) then DisplayMessageBox("Error in Ini file - looking for a " .. ty .. " value") else local j = (string.find(str, "=") + 1) if ty == "D" then -- Double return tonumber(string.sub(str, j)) end -- if end if ty == "I" then -- Intiger return math.floor(tonumber(string.sub(str, j))) end -- if end if ty == "S" then -- String return All_Trim(string.sub(str, j)) end -- if end if ty == "B" then -- Bool if "TRUE" == All_Trim(string.sub(str, j)) then return true else return false end -- if end end -- if end end -- if end end -- if end return nil end -- function end
INI_GetValue
Reads INI file and returns value
function INI_GetValue(xPath, FileName, GroupName, ItemName, ValueType) -- ==INI_GetValue(xPath, FileName, GroupName, ItemName, ValueType)== -- Returns a value from a file, group, and Item -- Usage: XX.YY = GetIniValue("C:/temp", "ScrewDia", "[Screws]", "Diameter", "D") local filenameR = xPath .. "\\" .. FileName .. ".ini" local FL = LengthOfFile(filenameR) local file = io.open(filenameR, "r") local dat = "." local ItemNameLen = string.len(ItemName) if file then while (FL >= 1) do dat = string.upper(All_Trim(file:read())) if dat == "[" .. string.upper(GroupName) .. "]" then break else FL = FL - 1 end -- if end end -- while end while (FL >= 1) do dat = string.upper(All_Trim(file:read())) if string.upper(ItemName) == string.sub(dat, 1, ItemNameLen) then break else FL = FL - 1 if FL == 0 then dat = "Error - item not found" break end -- if end end -- if end end -- while end file:close()-- closes the open file end -- if end local XX = StrIniValue(dat, ValueType) return XX end -- function end
INI_GetIDFor
Reads INI file and returns ID for a value
function INI_GetIDFor(xPath, FileName, GroupName, ItemValue) -- == INI_GetIDFor(xPath, FileName, GroupName, ItemValue) == -- Returns a ItemID from a file, group, and ItemValue -- Usage: XX.YY = INI_GetIDFor("C:/temp", "UserList", "[Users]", "Anderson") -- returns: "UserLastName22" local filenameR = xPath .. "\\" .. FileName .. ".ini" local FL = LengthOfFile(filenameR) local file = io.open(filenameR, "r") if file then local dat = "." local ItemValueLen = string.len(ItemValue) while (FL >= 1) do dat = string.upper(All_Trim(file:read())) if dat == "[" .. string.upper(GroupName) .. "]" then break else FL = FL - 1 end -- if end end -- while end while (FL >= 1) do dat = string.upper(All_Trim(file:read())) if string.upper(ItemValue) == HeadStrip(dat, "=") then break else FL = FL - 1 if FL == 0 then dat = "Error - item not found" break end -- if end end -- if end end -- while end file:close()-- closes the open file end -- if end local XX = NameStrip(dat, "=") return XX end -- function end
INI_ReadGroups
Reads INI file group and returns true if found
function INI_ReadGroups(xFile, aName) --[[Reads INI and returns a list contain the [Headers] as Array IniFile = {} Global variables xPath = script_path ]] local filename = xFile local file = io.open(filename, "r") if file then local fLength = (LengthOfFile(filename) - 1) local dat = All_Trim(file:read()) while (fLength >= 1) do if "[" == string.sub(dat, 1, 1) then table.insert (aName, string.sub(dat, 2, -2)) end dat = file:read() if dat then dat = All_Trim(dat) else file:close()-- closes the open file return true end fLength = fLength - 1 end -- while end -- if if file then file:close() end return true end -- function end
INI_ProjectHeaderReader
Reads INI file group and returns the INI Header values of a ini file and uploads to "IniFile" Array
function INI_ProjectHeaderReader(xPath) local filename = xPath .. "/CabinetProjects.ini" local file = io.open(filename, "r") if file then local Cabing = (LengthOfFile(filename) - 1) local dat = All_Trim(file:read()) while (Cabing >= 1) do if "[" == string.sub(dat, 1, 1) then table.insert (Projects, string.sub(dat, 2, -2)) end dat = file:read() if dat then dat = All_Trim(dat) else return true end Cabing = Cabing - 1 end file:close() end return true end -- function end
INI_AddNewProject
Appends a New Project to CabinetProjectQuestion.ini
function INI_AddNewProject(xPath, xGroup) local filename = xPath .. "/ProjectList.ini" local file = io.open(filename, "a") if file then file:write("[" .. All_Trim(xGroup) .. "] \n") file:write("load_date = " .. StartDate(true) .. " \n") file:write("#====================================== \n") file:close()-- closes the open file end return true end -- function end
INI_StdHeaderReader
Gets the INI Header values of a ini file and uploads to "IniFile" Array
function INI_StdHeaderReader(xPath, Fname) local filename = xPath .. "\\" .. Fname .. ".ini" local file = io.open(filename, "r") if file then local WallMilling = (LengthOfFile(filename) - 1) local dat = All_Trim(file:read()) while (WallMilling >= 0) do if "[" == string.sub(dat, 1, 1) then table.insert (IniFile, string.sub(dat, 2, -2)) end -- if end dat = file:read() if dat then dat = All_Trim(dat) else return true end -- if end WallMilling = WallMilling - 1 end -- while end file:close() end return true end -- function end
INI_ReadProjectinfo
Reads an ini files group and sets the table.names
function INI_ReadProjectinfo(Table, xPath, xGroup, xFile) Table.ProjectContactEmail = GetIniValue(xPath, xFile, xGroup, "ProjectQuestion.ProjectContactEmail", "S") Table.ProjectContactName = GetIniValue(xPath, xFile, xGroup, "ProjectQuestion.ProjectContactName", "S") Table.ProjectContactPhoneNumber = GetIniValue(xPath, xFile, xGroup, "ProjectQuestion.ProjectContactPhoneNumber", "S") Table.ProjectName = GetIniValue(xPath, xFile, xGroup, "ProjectQuestion.ProjectName", "S") Table.ProjectPath = GetIniValue(xPath, xFile, xGroup, "ProjectQuestion.ProjectPath", "S") Table.StartDate = GetIniValue(xPath, xFile, xGroup, "ProjectQuestion.StartDate", "S") return true end -- function end
INI_UpdateItem
Deletes old ini (.bak) file
Copys the .ini to a backup (.bak) new file
Reads the new backup file and writes a new file to the xGroup
Writes new xValue for the for the xItem
Reads and writes a new file to end of file
function INI_UpdateItem(xPath, xFile, xGroup, xItem, xValue) local NfileName = xPath .. "\\" .. xFile .. ".ini" local OfileName = xPath .. "\\" .. xFile .. ".bak" os.remove(OfileName) if CopyFileFromTo(NfileName, OfileName) then-- makes backup file local fileR = io.open(OfileName) local fileW = io.open(NfileName, "w") if fileR and fileW then local groups = false local txt = "" for Line in fileR:lines() do txt = Line if All_Trim(Line) == "[" .. All_Trim(xGroup) .. "]" then -- Group groups = true end -- if end if xItem == string.sub(Line, 1, string.len(xItem)) then -- Item if groups then txt = xItem .. " = " .. xValue groups = false end -- if end end -- if end fileW:write(txt .. "\n") txt = "" end -- for end os.remove(OfileName) fileR:close() fileW:close() end end return true end -- function end
INI_ReadProject
Reads the ini file for project data
function INI_ReadProject(xPath, xFile, xGroup) -- Milling = {} Milling.LayerNameBackPocket = GetIniValue(xPath, xFile, xGroup, "Milling.LayerNameBackPocket", "S") Milling.LayerNameTopBottomCenterDado = GetIniValue(xPath, xFile, xGroup, "Milling.LayerNameTopBottomCenterDado", "S") Milling.LayerNameDrawNotes = GetIniValue(xPath, xFile, xGroup, "Milling.LayerNameDrawNotes", "S") Milling.LayerNameDrawFaceFrame = GetIniValue(xPath, xFile, xGroup, "Milling.LayerNameDrawFaceFrame", "S") Milling.BackPocketDepthWall = GetIniValue(xPath, xFile, xGroup, "Milling.BackPocketDepthWall", "N") Milling.BlindDadoSetbackWall = GetIniValue(xPath, xFile, xGroup, "Milling.BlindDadoSetbackWall", "N") Milling.CabDepthWall = GetIniValue(xPath, xFile, xGroup, "Milling.CabDepthWall", "N") return true end -- function end
INI_TestDeleteDups
Reads the ini file for dups and deletes
function INI_TestDeleteDups() --[[ Requires 3 global variables clean = {} dups = {} Names = {} ]] local myPath = "C:\\Users\\CNC\\Documents\\test" local myName = "Tester" local myfile = "C:\\Users\\CNC\\Documents\\test\\Tester.ini" INI_ReadGroups(myfile, Names) FindDups(Names, dups, clean) for i,v in ipairs(dups) do INI_DeleteGroup(myPath, myName, v) end return true end -- function end
Data Import Tools
This object is used to import data to a gadget.
Read_CSV
Reads a CSV file based on header and format (Requires modifications per usage)
function Read_CSV(xFile, Header) --Read_CSV(Door.CSVFile, true) local fileR = io.open(xFile) local xLine = "" local result = {} if fileR then for Line in fileR:lines() do xLine = Line if Header then Header = false else xLine = All_Trim(Line) for match in (xLine..","):gmatch("(.-)"..",") do table.insert(result, match) end -- for end Door.Count = tonumber(result[1]) Door.Height = tonumber(result[2]) Door.Width = tonumber(result[3]) result = {} while Door.Count > 0 do if Door.Style == StyleA.Name then DoorStyleA() elseif Door.Style == StyleB.Name then DoorStyleB() elseif Door.Style == StyleC.Name then DoorStyleC() elseif Door.Style == StyleE.Name then DoorStyleE() elseif Door.Style == StyleF.Name then DoorStyleF() elseif Door.Style == StyleG.Name then DoorStyleG() else DisplayMessageBox("No Style Select!") end --if end Door.Count = Door.Count - 1 end -- for end end --if end Door.Record = Door.Record + 1 MyProgressBar:SetPercentProgress(ProgressAmount(Door.Record)) end --for end end --if end return true end -- function end
Job Tools
This object is a name-value pair that represents a Document Variable within a VectricJob.
function ValidJob() -- A better error message local job = VectricJob() if not job.Exists then DisplayMessageBox("Error: Cannot run Gadget, no drawing found \n" .. "Please create a new file (drawing) and \n" .. "specify the material dimensions \n" ) return false else return true end -- if end end -- ValidJob end
MoveSetectedVectors
function MoveSetectedVectors(job, NewBasePoint) local Selection = job.Selection if Selection.IsEmpty then MessageBox("LayoutImportedVectors: No vectors selected!") return false end local MySelection = Selection:GetBoundingBox(); if not NewBasePoint then NewBasePoint = Point2D(0,0) end local MyNewLocatioin = BasePoint - MySelection.BLC local Txform = TranslationMatrix2D(MyNewLocatioin) Selection:Transform(Txform) return true end
FixPath
function FixPath(path) -- Lua Returns a fixed path return path:gsub("%\\", "/") end -- function end ---- function FixPath(myPath) { -- JavaScript Tool Returns a fixed path /* myPath = "C:\\User\\Bob\\Home\\Drawings"; */ /* NewPath = "C:/User/Bob/Home/Drawings"; */ var NewPath = ""; var myLetter = ""; var CheckPathLen = myPath.length; for (let i = 0; i < myPath.length; i++) { myLetter = myPath.charAt(i) if myLetter.charCodeAt(0) == 92 { NewPath = NewPath + "/"; } else { NewPath = NewPath + myLetter; } } return NewPath; }
RotateSetectedVectors
function RotateSetectedVectors(job, NewBasePoint, NewAngle) local Selection = job.Selection if not NewBasePoint then NewBasePoint = Point2D(0,0) end -- if end if not NewAngle then NewAngle = 0.0 end -- if end if Selection.IsEmpty then MessageBox("Error: Rotation function: No vectors selected!") return false end -- if end local MySelection = Selection:GetBoundingBox(); local MyNewLocatioin = BasePoint - MySelection.BLC local Txform = RotationMatrix2D(NewBasePoint, NewAngle) Selection:Transform(Txform) return true end
GetUnits
function GetUnits(UTable) -- returns Drawing Units data local mtl_block = MaterialBlock() if mtl_block.InMM then UTable.Units = "Drawing Units: mm" UTable.Unit = true UTable.UnitCheck = {"metric", "kilometer", "kilometers", "kh", "meter", "meters", "m", "decimeter", "decimeters", "dm", "centimeter", "centimeters", "cm", "millimeter", "millimeters", "mm"} UTable.Cal = 25.4 else UTable.Units = "Drawing Units: inches" UTable.Unit = false UTable.UnitCheck = {"imperial", "miles", "mile", "mi", "yards", "yard", "yd", "feet", "foot", "ft", "inches", "inch", "in", "fractions", "fraction"} UTable.Cal = 1.0 end return true end -- end function
CheckTheUnits
function CheckTheUnits(UTable, Value) -- Checks if the unit of messure in of drawing units local goodtogo = false for i=1, #UTable.UnitCheck do if string.upper(Value) == string.upper(UTable.UnitCheck[i]) then goodtogo = true break end -- if end end -- for end if goodtogo then return true else return false end -- if end end -- function end
GetMatlBlk
function GetMatlBlk(Table) local mtl_block = MaterialBlock() if mtl_block.InMM then Table.Units = "Drawing Units: mm" Table.Unit = true else Table.Units = "Drawing Units: inches" Table.Unit = false end if mtl_block.Width> mtl_block.Height then Table.MaterialThickness = mtl_block.Height Table.MaterialLength = mtl_block.Width Table.Orantation = "H" else Table.MaterialThickness = mtl_block.Width Table.MaterialLength = mtl_block.Height Table.Orantation = "V" end Table.FrontThickness = Dovetail.MaterialThickness Table.SideThickness = Dovetail.MaterialThickness if mtl_block.Height == mtl_block.Width then MessageBox("Error! Material block cannot square") end return true end -- end function
GetBoxJointMaterialSettings
function GetBoxJointMaterialSettings(Table) local mtl_block = MaterialBlock() --local units if mtl_block.InMM then Table.Units = "Drawing Units: mm" Table.Unit = true else Table.Units = "Drawing Units: inches" Table.Unit = false end if mtl_block.Width > mtl_block.Height then Table.MaterialThickness = mtl_block.Height Table.MaterialLength = mtl_block.Width Table.Orantation = "H" else Table.MaterialThickness = mtl_block.Width Table.MaterialLength = mtl_block.Height Table.Orantation = "V" end if mtl_block.Height == mtl_block.Width then MessageBox("Error! Material block cannot square") end -- Display material XY origin local xy_origin_text = "invalid" local xy_origin = mtl_block.XYOrigin if xy_origin == MaterialBlock.BLC then Table.xy_origin_text = "Bottom Left Corner" if Table.Orantation == "V" then Table.Direction1 = 90.0 Table.Direction2 = 0.0 Table.Direction3 = 270.0 Table.Direction4 = 180.0 Table.Bulge = 1.0 else Table.Direction1 = 0.0 Table.Direction2 = 90.0 Table.Direction3 = 180.0 Table.Direction4 = 270.0 Table.Bulge = -1.0 end elseif xy_origin == MaterialBlock.BRC then Table.xy_origin_text = "Bottom Right Corner" if Table.Orantation == "V" then Table.Direction1 = 90.0 Table.Direction2 = 180.0 Table.Direction3 = 270.0 Table.Direction4 = 0.0 Table.Bulge = -1.0 else Table.Direction1 = 180.0 Table.Direction2 = 90.0 Table.Direction3 = 0.0 Table.Direction4 = 270.0 Table.Bulge = 1.0 end elseif xy_origin == MaterialBlock.TRC then Table.xy_origin_text = "Top Right Corner" if Table.Orantation == "V" then Table.Direction1 = 270.0 Table.Direction2 = 180.0 Table.Direction3 = 90.0 Table.Direction4 = 0.0 Table.Bulge = 1.0 else Table.Direction1 = 180.0 Table.Direction2 = 270.0 Table.Direction3 = 0.0 Table.Direction4 = 90.0 Table.Bulge = -1.0 end elseif xy_origin == MaterialBlock.TLC then Table.xy_origin_text = "Top Left Corner" if Table.Orantation == "V" then Table.Direction1 = 270.0 Table.Direction2 = 0.0 Table.Direction3 = 90.0 Table.Direction4 = 180.0 Table.Bulge = -1.0 else Table.Direction1 = 0.0 Table.Direction2 = 270.0 Table.Direction3 = 180.0 Table.Direction4 = 90.0 Table.Bulge = 1.0 end elseif xy_origin == MaterialBlock.CENTRE then -- NOTE: English spelling for Centre! Table.xy_origin_text = "Center" if Table.Orantation == "V" then Table.Direction1 = 0.0 Table.Direction2 = 0.0 Table.Direction3 = 0.0 Table.Direction4 = 0.0 Table.Bulge = 1.0 else Table.Direction1 = 0.0 Table.Direction2 = 0.0 Table.Direction3 = 0.0 Table.Direction4 = 0.0 Table.Bulge = -1.0 end MessageBox("Error! " .. xy_origin_text .. " Must be set at a corner of the Material") else Table.xy_origin_text = "Unknown XY origin value!" MessageBox("Error! " .. xy_origin_text .. " Must be set at a corner of the Material") if Table.Orantation == "V" then Table.Direction1 = 0 Table.Direction2 = 0 Table.Direction3 = 0 Table.Direction4 = 0 else Table.Direction1 = 0 Table.Direction2 = 0 Table.Direction3 = 0 Table.Direction4 = 0 end end -- Setup Fingers and Gaps Table.NoFingers0 = 1 + (Rounder(BoxJoint.MaterialLength / BoxJoint.MaterialThickness, 0)) Table.NoFingers2 = Rounder(BoxJoint.NoFingers0 / 2, 0) Table.FingerSize = BoxJoint.MaterialLength / BoxJoint.NoFingers0 Table.NoFingers1 = BoxJoint.NoFingers0 - BoxJoint.NoFingers2 return true end -- function end
GetMaterialSettings
function GetMaterialSettings(Table) local MaterialBlock = MaterialBlock() Table.MaterialBlockThickness = MaterialBlock.Thickness Table.xy_origin = MaterialBlock.XYOrigin if MaterialBlock.InMM then Table.Units = "Drawing Units: mm" Table.Unit = true Table.Cal = 25.4 else Table.Units = "Drawing Units: inches" Table.Unit = false Table.Cal = 1.0 end --local units if MaterialBlock.Width > MaterialBlock.Height then Table.Orantation = "H" -- Horizontal elseif MaterialBlock.Width < MaterialBlock.Height then Table.Orantation = "V" -- Vertical else Table.Orantation = "S" -- Squair end if Table.xy_origin == MaterialBlock.BLC then Table.XYorigin = "Bottom Left Corner" elseif Table.xy_origin == MaterialBlock.BRC then Table.XYorigin = "Bottom Right Corner" elseif Table.xy_origin == MaterialBlock.TRC then Table.XYorigin = "Top Right Corner" else Table.XYorigin = "Top Left Corner" end -- if end Table.UnitDisplay = "Note: Units: (" .. Table.Units ..")" return true end -- end function
IsSingleSided
function IsSingleSided(Table) local SingleSided = Table.job.IsSingleSided if not SingleSided then DisplayMessageBox("Error: Job must be a single sided job") return false end -- if end end -- function end
IsDoubleSided
function IsDoubleSided(Table) if not Table.job.IsDoubleSided then DisplayMessageBox("Error: Job must be a Double Sided Project") return false else return true end -- if end end-- function end
ShowSetting
function ShowSetting(Table) local name = "" DisplayMessageBox( name .. " MaterialThickness = " .. tostring(Table.MaterialThickness) .."\n" .. name .. " BottleRad = " .. tostring(Table.BottleRad) .."\n" .. name .. " SideLenght = " .. tostring(Table.SideLenght) .."\n" .. name .. " SideHight = " .. tostring(Table.SideHight) .."\n" .. name .. " EndLenght = " .. tostring(Table.EndLenght) .."\n" .. name .. " EndHight = " .. tostring(Table.EndHight) .."\n" .. name .. " TopLenght = " .. tostring(Table.TopLenght) .."\n" .. name .. " TopWidht = " .. tostring(Table.TopWidht) .."\n" .. name .. " HandleLenght = " .. tostring(Table.HandleLenght) .."\n" .. name .. " HandleWidht = " .. tostring(Table.HandleWidht) .."\n" .. name .. " HandleRad = " .. tostring(Table.HandleRad) .."\n" .. name .. " MillingBitRad = " .. tostring(Table.MillingBitRad) .."\n" .. "\n") end -- function end
MakeLayers
function MakeLayers() local Red, Green, Blue = 0, 0, 0 local function GetColor(str) -- returns color value for a Color Name local sx = str local Red = 0 local Green = 0 local Blue = 0 local Colors = {} Colors.Black = "0,0,0" Colors.Red = "255,0,0" Colors.Blue = "0,0,255" Colors.Yellow = "255,255,0" Colors.Cyan = "0,255,255" Colors.Magenta = "255,0,255" Colors.Green = "0,128,0" if "" == str then DisplayMessageBox("Error: Empty string passed") else str = Colors[str] if "string" == type(str) then if string.find(str, ",") then Red = tonumber(string.sub(str, 1, assert(string.find(str, ",") - 1))) str = string.sub(str, assert(string.find(str, ",") + 1)) Green = tonumber(string.sub(str, 1, assert(string.find(str, ",") - 1))) Blue = tonumber(string.sub(str, assert(string.find(str, ",") + 1))) end else DisplayMessageBox("Error: Color " .. sx .. " not Found" ) Red = 0 Green = 0 Blue = 0 end end return Red, Green, Blue end local layer = Milling.job.LayerManager:GetLayerWithName(Milling.LNBackPocket) Red, Green, Blue = GetColor(Milling.LNBackPocketColor) layer:SetColor (Red, Green, Blue) layer = Milling.job.LayerManager:GetLayerWithName(Milling.LNBackProfile) Red, Green, Blue = GetColor(Milling.LNBackProfileColor) layer:SetColor (Red, Green, Blue) return true end -- function end
MyLayerClear
function MyLayerClear(LayerName) local Mylayer = Milling.job.LayerManager:GetLayerWithName(LayerName) if Mylayer.IsEmpty then Milling.job.LayerManager:RemoveLayer(Mylayer) end -- if end return true end -- function end
LayerClear
function LayerClear() -- calling MyLayerClear MyLayerClear(Milling.LNBackPocket .. "-Wall") MyLayerClear(Milling.LNBackPocket .. "-Base") MyLayerClear(Milling.LNBackProfile .. "-Wall") MyLayerClear(Milling.LNBackProfile .. "-Base") MyLayerClear("PartLabels") return true end -- function end
Logic and Test Tools
These functions are named as per there function or action.
CheckNumber
function CheckNumber(num) if type(num) == "number" then return true else return false end -- if end end -- function end
AboveZero
function AboveZero(num) if (type(num) == "number") and (num > 0.0)then return true else return false end -- if end end -- function end
IsNumber()
function IsNumber(Val) --Return true if Val is number if tonumber(x) ~= nil then return true end -- if end return false end -- end function
IsEven()
function IsEven(IsEven_Number) -- Returns True/False if number is even if (IsEven_Number % 2 == 0) then return true else return false end -- if end end -- function end
IsOdd()
function IsOdd(IsOdd_Number) -- Returns True/False if number is odd if(IsOdd_Number%2 == 0) then return false end -- end if return true end -- function end
IsNegative()
function IsNegative(x) -- Returns True/False if number is a negative number if x >=0.0 then return false else return true end -- if end end -- function end
IsAllNumber()
function IsAllNumber(str) -- Returns True/False if finds all numbers in string local out = true local let = "" for i = 1, #str do let = str:byte(i) if (let ~= 48) and (let ~= 49) and (let ~= 50) and (let ~= 51) and (let ~= 52) and (let ~= 53) and (let ~= 54) and (let ~= 55) and (let ~= 56) and (let ~= 57) and (let ~= 46) then out = false end -- if end end -- for end return out -- send out the return end -- function end
NonNumber()
function NonNumber(Val) -- Return true if val is not number if tonumber(x) ~= nil then return false end -- if end return true end -- end function
NumberType()
function NumberType(Val) -- Return true if val is not number if math.type(x) == "integer" then return "integer" else return "float" end -- if end end -- end function
Math Tools
This object is a name-value pair that represents a Document Variable within a VectricJob.
ArcSegment()
function ArcSegment(p1, p2, Rad) -- Returns the Arc Segment local chord = math.sqrt(((p2.x - p1.x) ^ 2) + ((p2.y - p1.y) ^ 2)) local segment = (Rad - (0.5 * (math.sqrt((4.0 * Rad^2) - chord^2)))) return segment end -- function end
D(x) Doubles x
function D(x) -- Returns double the value return x * 2.0 end -- function end
H(x) Halfs x
function H(x) -- Returns half the value return x * 0.5 end -- function end
C(x) Returns x by scale
function C(x) -- Returns scale value return x * Project.Cal end -- function end
ChordSag2Radius()
function ChordSag2Radius (Chr, Seg) -- Returns the Rad from Chord and Seg local rad = ((((Chr * Chr)/(Seg * 4)) + Seg) / 2.0) return rad end -- function end
RadSag2Chord()
function RadSag2Chord(Rad, Seg) -- Returns the Chord from Rad and Seg local Ang = 2 * math.acos(1 - (Seg/Rad)) local Chord = (2 * Rad) * math.sin(Ang * 0.5) return Chord end -- function end
RadChord2Segment()
function RadChord2Segment (Rad, Chord) -- Returns the Arc Segment from Rad and Chord local segment = (Rad - (0.5 * (math.sqrt((4.0 * Rad^2) - Chord^2)))) return segment end -- function end
RoundTo()
function RoundTo(Num, Per) -- Returns the number from local Head = Num < 0 and math.ceil(Num) or math.floor(Num) local Tail = Num - Head local Value = Head + tonumber(string.sub(tostring(Tail), 1, Per + 2)) return Value end -- function end
Round()
function Round(x) return x>=0 and math.floor(x+0.5) or math.ceil(x-0.5) end
DecimalPlaces()
function DecimalPlaces(Dnum, Plac) return tonumber(string.sub(tostring(Dnum) .. "000000000000000000000000000000000000",1, string.len(tostring(math.floor(Dnum))) + 1 + Plac)) end
ToInteger()
function ToInteger( x ) local num = tonumber( x ) return num < 0 and math.ceil( num ) or math.floor( num ) end
TrigIt
Finds all 5 properties of a triangle
function TrigIt(A, B, AB, AC, BC) -- Sub Function to help other functions -- Call = A, B, AB, AC, BC = Trig(A, B, AB, AC, BC) -- C is the corner, A = small ang and B is the big angle -- returns all values -- A, B = angles -- C = 90.0 Deg -- B to C (BC) is Run - Base - adjacent -- A to C (AC) is Rise - Height - opposite -- A to B (AB) is Slope - hypotenuse if (B > 0.0) and (A == 0.0) then A = math.deg(math.rad(90) - math.rad(B)) end if (A > 0.0) and (B == 0.0) then B = math.deg(math.rad(90) - math.rad(A)) end if (AC > 0.0) and (BC > 0.0) then AB = math.sqrt((AC ^ 2) + (BC ^ 2)) A = math.deg(math.atan(BC/AC)) B = math.deg(math.rad(90) - math.rad(A)) elseif (AB > 0.0) and (BC > 0.0) then AB = math.sqrt((AB ^ 2) - (BC ^ 2)) A = math.deg(math.atan(BC/AC)) B = math.deg(math.rad(90) - math.rad(A)) elseif (AB > 0.0) and (AC > 0.0) then AB = math.sqrt((AB ^ 2) - (AC ^ 2)) A = math.deg(math.atan(BC/AC)) B = math.deg(math.rad(90) - math.rad(A)) elseif (A > 0.0) and (AC > 0.0) then AB = AC / math.cos(math.rad(A)) BC = AB * math.sin(math.rad(A)) elseif (A > 0.0) and (BC > 0.0) then AB = BC / math.sin(math.rad(A)) AC = AB * math.cos(math.rad(A)) elseif (A > 0.0) and (AB > 0.0) then BC = AB * math.sin(math.rad(A)) AC = AB * math.cos(math.rad(A)) else MessageBox("Error: No Missing Value") end -- if end return A, B, AB, AC, BC end
Registry Read and Write Tools
This object is a name-value pair that represents a Document Variable within a VectricJob.
DocVarChk()
function DocVarChk(Name, Value) local job = VectricJob() local document_variable_list = job.DocumentVariables return document_variable_list:DocumentVariableExists(Name) end -- function end
DocVarGet()
function DocVarGet(Name) local job = VectricJob() local document_variable_list = job.DocumentVariables return document_variable_list:GetDocumentVariable(Name, 0.0) end -- function end
DocVarSet()
function DocVarSet(Name, Value) local job = VectricJob() local document_variable_list = job.DocumentVariables return document_variable_list:SetDocumentVariable(Name, Value) end -- function end
RegistryReadMaterial()
function RegistryReadMaterial() -- Read from Registry Material values for LUA Bit local RegistryRead = Registry("Material") Milling.SafeZGap = Rounder(RegistryRead:GetString("SafeZGap", "0.500"), 4) Milling.StartZGap = Rounder(RegistryRead:GetString("StartZGap", "0.500"), 4) Milling.HomeX = Rounder(RegistryRead:GetString("HomeX", "0.000"), 4) Milling.HomeY = Rounder(RegistryRead:GetString("HomeY", "0.000"), 4) Milling.HomeZGap = Rounder(RegistryRead:GetString("HomeZGap", "0.750"), 4) return true end -- function end
RegistryLastTenFiles()
function RegistryLastTenFiles(FileName) -- Adds to the top ten Log file list local Registry = Registry(RegName) LogFile.File10 = Registry:GetString("LogFile.File09", "No Log Yet" ) LogFile.File09 = Registry:GetString("LogFile.File08", "No Log Yet" ) LogFile.File08 = Registry:GetString("LogFile.File07", "No Log Yet" ) LogFile.File07 = Registry:GetString("LogFile.File06", "No Log Yet" ) LogFile.File06 = Registry:GetString("LogFile.File05", "No Log Yet" ) LogFile.File05 = Registry:GetString("LogFile.File04", "No Log Yet" ) LogFile.File04 = Registry:GetString("LogFile.File03", "No Log Yet" ) LogFile.File03 = Registry:GetString("LogFile.File02", "No Log Yet" ) LogFile.File02 = Registry:GetString("LogFile.File01", "No Log Yet" ) LogFile.File01 = FileName return FileName end -- function end
RegistryRead()
function RegistryRead() -- Read from Registry values local RegistryRead = Registry("RegName") local Yes_No = RegistryRead:GetBool("BaseDim.Yes_No", ture) local CabHeight = RegistryRead:GetDouble("BaseDim.CabHeight", 35.500) local CabCount = RegistryRead:GetInt("BaseDim.CabCount", 36) local Name = RegistryRead:GetString("BaseDim.Name", "Words") Milling.MillTool1.FeedRate = RegistryRead:GetDouble("Milling.MillTool1.FeedRate", 30.000) Milling.MillTool1.InMM = RegistryRead:GetBool("Milling.MillTool1.InMM ", false) Milling.MillTool1.Name = RegistryRead:GetString("Milling.MillTool1.Name", "No Tool Selected") Milling.MillTool1.BitType = RegistryRead:GetString("Milling.MillTool1.BitType", "END_MILL") -- BALL_NOSE, END_MILL, VBIT Milling.MillTool1.RateUnits = RegistryRead:GetInt("Milling.MillTool1.RateUnits", 4) Milling.MillTool1.SpindleSpeed = RegistryRead:GetInt("Milling.MillTool1.SpindleSpeed", 20000) Milling.MillTool1.ToolNumber = RegistryRead:GetInt("Milling.MillTool1.ToolNumber", 1) Milling.MillTool1.Stepdown = RegistryRead:GetDouble("Milling.MillTool1.Stepdown", 0.2000) Milling.MillTool1.Stepover = RegistryRead:GetDouble("Milling.MillTool1.Stepover", 0.0825) Milling.MillTool1.ToolDia = RegistryRead:GetDouble("Milling.MillTool1.ToolDia", 0.1250) Milling.MillTool1.PlungeRate = RegistryRead:GetDouble("Milling.MillTool1.PlungeRate", 15.000) Milling.MillTool2.FeedRate = RegistryRead:GetDouble("Milling.MillTool2.FeedRate", 30.000) Milling.MillTool2.InMM = RegistryRead:GetBool("Milling.MillTool2.InMM ", false) Milling.MillTool2.Name = RegistryRead:GetString("Milling.MillTool2.Name", "No Tool Selected") Milling.MillTool2.BitType = RegistryRead:GetString("Milling.MillTool2.BitType", "BALL_NOSE") -- BALL_NOSE, END_MILL, VBIT Milling.MillTool2.RateUnits = RegistryRead:GetInt("Milling.MillTool2.RateUnits", 4) Milling.MillTool2.SpindleSpeed = RegistryRead:GetInt("Milling.MillTool2.SpindleSpeed", 20000) Milling.MillTool2.ToolNumber = RegistryRead:GetInt("Milling.MillTool2.ToolNumber", 2) Milling.MillTool2.Stepdown = RegistryRead:GetDouble("Milling.MillTool2.Stepdown", 0.2000) Milling.MillTool2.Stepover = RegistryRead:GetDouble("Milling.MillTool2.Stepover", 0.0825) Milling.MillTool2.ToolDia = RegistryRead:GetDouble("Milling.MillTool2.ToolDia", 0.1250) Milling.MillTool2.PlungeRate = RegistryRead:GetDouble("Milling.MillTool2.PlungeRate", 15.000) Milling.MillTool3.FeedRate = RegistryRead:GetDouble("Milling.MillTool3.FeedRate", 30.000) Milling.MillTool3.InMM = RegistryRead:GetBool("Milling.MillTool3.InMM", false) Milling.MillTool3.Name = RegistryRead:GetString("Milling.MillTool3.Name", "No Tool Selected") Milling.MillTool3.BitType = RegistryRead:GetString("Milling.MillTool3.BitType", "END_MILL") -- BALL_NOSE, END_MILL, VBIT Milling.MillTool3.RateUnits = RegistryRead:GetInt("Milling.MillTool3.RateUnits", 4) Milling.MillTool3.SpindleSpeed = RegistryRead:GetInt("Milling.MillTool3.SpindleSpeed", 20000) Milling.MillTool3.ToolNumber = RegistryRead:GetInt("Milling.MillTool3.ToolNumber", 3) Milling.MillTool3.Stepdown = RegistryRead:GetDouble("Milling.MillTool3.Stepdown", 0.2000) Milling.MillTool3.Stepover = RegistryRead:GetDouble("Milling.MillTool3.Stepover", 0.0825) Milling.MillTool3.ToolDia = RegistryRead:GetDouble("Milling.MillTool3.ToolDia", 0.1250) Milling.MillTool3.PlungeRate = RegistryRead:GetDouble("Milling.MillTool3.PlungeRate", 15.000) Milling.MillTool4.FeedRate = RegistryRead:GetDouble("Milling.MillTool4.FeedRate", 30.000) Milling.MillTool4.InMM = RegistryRead:GetBool("Milling.MillTool4.InMM ", false) Milling.MillTool4.Name = RegistryRead:GetString("Milling.MillTool4.Name", "No Tool Selected") Milling.MillTool4.PlungeRate = RegistryRead:GetDouble("Milling.MillTool4.PlungeRate", 15.000) Milling.MillTool4.RateUnits = RegistryRead:GetInt("Milling.MillTool4.RateUnits", 4) Milling.MillTool4.SpindleSpeed = RegistryRead:GetInt("Milling.MillTool4.SpindleSpeed", 20000) Milling.MillTool4.Stepdown = RegistryRead:GetDouble("Milling.MillTool4.Stepdown", 0.2000) Milling.MillTool4.Stepover = RegistryRead:GetDouble("Milling.MillTool4.Stepover", 0.0825) Milling.MillTool4.ToolDia = RegistryRead:GetDouble("Milling.MillTool4.ToolDia", 0.1250) Milling.MillTool4.ToolNumber = RegistryRead:GetInt("Milling.MillTool4.ToolNumber", 5) Milling.MillTool5.FeedRate = RegistryRead:GetDouble("Milling.MillTool5.FeedRate", 30.000) Milling.MillTool5.InMM = RegistryRead:GetBool("Milling.MillTool5.InMM ", false) Milling.MillTool5.Name = RegistryRead:GetString("Milling.MillTool5.Name", "No Tool Selected") Milling.MillTool5.PlungeRate = RegistryRead:GetDouble("Milling.MillTool5.PlungeRate", 15.000) Milling.MillTool5.RateUnits = RegistryRead:GetInt("Milling.MillTool5.RateUnits", 4) Milling.MillTool5.SpindleSpeed = RegistryRead:GetInt("Milling.MillTool5.SpindleSpeed", 20000) Milling.MillTool5.Stepdown = RegistryRead:GetDouble("Milling.MillTool5.Stepdown", 0.2000) Milling.MillTool5.Stepover = RegistryRead:GetDouble("Milling.MillTool5.Stepover", 0.0825) Milling.MillTool5.ToolDia = RegistryRead:GetDouble("Milling.MillTool5.ToolDia", 0.1250) Milling.MillTool5.ToolNumber = RegistryRead:GetInt("Milling.MillTool5.ToolNumber", 6) return true end -- function end
RegistryWrite()
function RegistryWrite() -- Write to Registry values local RegistryWrite = Registry("RegName") local RegValue RegValue = RegistryWrite:SetBool("ProjectQuestion.CabinetName", true) RegValue = RegistryWrite:SetDouble("BaseDim.CabDepth", 23.0000) RegValue = RegistryWrite:SetInt("BaseDim.CabHeight", 35) RegValue = RegistryWrite:SetString("BaseDim.CabLength", "Words") RegValue = RegistryWrite:SetDouble("Milling.MillTool1.FeedRate" , Milling.MillTool1.FeedRate) RegValue = RegistryWrite:SetBool("Milling.MillTool1.InMM", Milling.MillTool1.InMM) RegValue = RegistryWrite:SetString("Milling.MillTool1.Name", Milling.MillTool1.Name) RegValue = RegistryWrite:SetString("Milling.MillTool1.BitType", Milling.MillTool1.BitType) RegValue = RegistryWrite:SetDouble("Milling.MillTool1.PlungeRate" , Milling.MillTool1.PlungeRate) RegValue = RegistryWrite:SetInt("Milling.MillTool1.RateUnits", Milling.MillTool1.RateUnits) RegValue = RegistryWrite:SetInt("Milling.MillTool1.SpindleSpeed", Milling.MillTool1.SpindleSpeed) RegValue = RegistryWrite:SetDouble("Milling.MillTool1.Stepdown" , Milling.MillTool1.Stepdown) RegValue = RegistryWrite:SetDouble("Milling.MillTool1.Stepover" , Milling.MillTool1.Stepover) RegValue = RegistryWrite:SetDouble("Milling.MillTool1.ToolDia" , Milling.MillTool1.ToolDia) RegValue = RegistryWrite:SetInt("Milling.MillTool1.ToolNumber", Milling.MillTool1.ToolNumber) RegValue = RegistryWrite:SetDouble("Milling.MillTool2.FeedRate" , Milling.MillTool2.FeedRate) RegValue = RegistryWrite:SetBool("Milling.MillTool2.InMM", Milling.MillTool2.InMM) RegValue = RegistryWrite:SetString("Milling.MillTool2.Name", Milling.MillTool2.Name) RegValue = RegistryWrite:SetString("Milling.MillTool2.BitType", Milling.MillTool2.BitType) RegValue = RegistryWrite:SetDouble("Milling.MillTool2.PlungeRate" , Milling.MillTool2.PlungeRate) RegValue = RegistryWrite:SetInt("Milling.MillTool2.RateUnits", Milling.MillTool2.RateUnits) RegValue = RegistryWrite:SetInt("Milling.MillTool2.SpindleSpeed", Milling.MillTool2.SpindleSpeed) RegValue = RegistryWrite:SetDouble("Milling.MillTool2.Stepdown" , Milling.MillTool2.Stepdown) RegValue = RegistryWrite:SetDouble("Milling.MillTool2.Stepover" , Milling.MillTool2.Stepover) RegValue = RegistryWrite:SetDouble("Milling.MillTool2.ToolDia" , Milling.MillTool2.ToolDia) RegValue = RegistryWrite:SetInt("Milling.MillTool2.ToolNumber", Milling.MillTool2.ToolNumber) RegValue = RegistryWrite:SetDouble("Milling.MillTool3.FeedRate" , Milling.MillTool3.FeedRate) RegValue = RegistryWrite:SetBool("Milling.MillTool3.InMM", Milling.MillTool3.InMM) RegValue = RegistryWrite:SetString("Milling.MillTool3.Name", Milling.MillTool3.Name) RegValue = RegistryWrite:SetString("Milling.MillTool3.BitType", Milling.MillTool3.BitType) RegValue = RegistryWrite:SetDouble("Milling.MillTool3.PlungeRate", Milling.MillTool3.PlungeRate) RegValue = RegistryWrite:SetInt("Milling.MillTool3.RateUnits", Milling.MillTool3.RateUnits) RegValue = RegistryWrite:SetInt("Milling.MillTool3.SpindleSpeed", Milling.MillTool3.SpindleSpeed) RegValue = RegistryWrite:SetDouble("Milling.MillTool3.Stepdown" , Milling.MillTool3.Stepdown) RegValue = RegistryWrite:SetDouble("Milling.MillTool3.Stepover" , Milling.MillTool3.Stepover) RegValue = RegistryWrite:SetDouble("Milling.MillTool3.ToolDia" , Milling.MillTool3.ToolDia) RegValue = RegistryWrite:SetInt("Milling.MillTool3.ToolNumber", Milling.MillTool3.ToolNumber) RegValue = RegistryWrite:SetDouble("Milling.MillTool4.FeedRate" , Milling.MillTool4.FeedRate) RegValue = RegistryWrite:SetBool("Milling.MillTool4.InMM", Milling.MillTool4.InMM) RegValue = RegistryWrite:SetString("Milling.MillTool4.Name", Milling.MillTool4.Name) RegValue = RegistryWrite:SetDouble("Milling.MillTool4.PlungeRate" , Milling.MillTool4.PlungeRate) RegValue = RegistryWrite:SetInt("Milling.MillTool4.RateUnits", Milling.MillTool4.RateUnits) RegValue = RegistryWrite:SetInt("Milling.MillTool4.SpindleSpeed", Milling.MillTool4.SpindleSpeed) RegValue = RegistryWrite:SetDouble("Milling.MillTool4.Stepdown" , Milling.MillTool4.Stepdown) RegValue = RegistryWrite:SetDouble("Milling.MillTool4.Stepover" , Milling.MillTool4.Stepover) RegValue = RegistryWrite:SetDouble("Milling.MillTool4.ToolDia" , Milling.MillTool4.ToolDia) RegValue = RegistryWrite:SetInt("Milling.MillTool4.ToolNumber", Milling.MillTool4.ToolNumber) return true end -- function end
REG_CheckRegistryBool()
function REG_CheckRegistryBool() -- Checks Registry for Bool values local RegistryRead = Registry("RegName") if RegistryRead:BoolExists("ProjectQuestion.Runtool") then DisplayMessageBox("Alert: The Runtool value is saved.") else DisplayMessageBox("Alert: The Runtool value is not saved.") end -- if end return true end -- function end
REG_CheckRegistryDouble()
function REG_CheckRegistryDouble() -- Checks Registry for Double values local RegistryRead = Registry("RegName") if RegistryRead:DoubleExists("ProjectQuestion.ProjectCost") then DisplayMessageBox("Alert: The project cost is saved.") else DisplayMessageBox("Alert: The Project Cost is not saved.") end -- if end return true end -- function end
REG_CheckRegistryInt()
function REG_CheckRegistryInt() -- Checks Registry for Int values local RegistryRead = Registry("RegName") if RegistryRead:IntExists("ProjectQuestion.ProjectCount") then DisplayMessageBox("Alert: The Project Count is saved.") else DisplayMessageBox("Alert: The Project Count is not saved.") end -- if end return true end -- function end
REG_CheckRegistryString()
function REG_CheckRegistryString() -- Checks Registry for String values local RegistryRead = Registry("RegName") if RegistryRead:StringExists("ProjectQuestion.ProjectPath") then DisplayMessageBox("Alert: The Project path is saved.") else DisplayMessageBox("Alert: The Project path is not saved.") end return true end -- function end
String Tools
This object is a name-value pair that represents a Document Variable within a VectricJob.
StringToArraySplit
function StringToArraySplit(s, delimiter) --[[ split_string = StringToArraySplit("Hello World,Jim,Bill,Tom", ",") Returns = array -- split_string[1] = "Hello World,) -- split_string[2] = "Jim" ]] result = {}; for match in (s..delimiter):gmatch("(.-)"..delimiter) do table.insert(result, match) end return result end
WrapString
function WrapString(Str, Wid) -- wraps text at the nearest space and puts a return char in the space location --[[ How to use: Call WrapString(string, Number) WrapString("Jim is a tall man that lives in Texas. He was raised in North East Texas on 1000 acres from 1970 to 1982. This is a man that knows numbers of great people from a round the world.", 40) returns "Jim is a tall man that lives in Texas.\n He was raised in North East Texas on\n 1000 acres from 1970 to 1982. This is a man\n that knows numbers of great people from\n a round the world." ]] local Wider = Wid local Posx = string.len(Str) local StrLen = string.len(Str) local pt = 0 local function FindSpace(MyStr) local Pos = string.len(MyStr) local str = MyStr if string.find(MyStr, " ") ~= nil then while Pos>0 do Pos = Pos - 1 if (string.byte(string.sub(str,-1)) == 32) then break else str = string.sub(str, 1, Pos) end end end return Pos end if StrLen > Wider then while Wider < Posx do pt = FindSpace(string.sub(Str,1, Wider)) Str = string.sub(Str, 1, pt) .. "\n" .. string.sub(Str, pt +2) Wider = Wider + Wid end end return Str end -- function end
CleanString
function CleanString(inStr) -- Check for ascii letters below 127 local outStr, str1 = "" local inStrLen = string.len(inStr) for i = 1, inStrLen ,1 do str1 = string.sub(inStr, i, i) if string.byte(str1) <= 127 then outStr=outStr .. str1 end end return outStr end -- function end
GetDiameterAndCentre
function CheckString(YourStr) -- Check string for specal bite chars for HTML local function FindLetter(TheStr, TestChar) local outStr = false local strChar = "" local TheStrLen = string.len(TheStr) for i = 1, TheStrLen ,1 do strChar = string.sub(TheStr, i, i) if string.byte(strChar) == string.byte(TestChar) then outStr = true break end end return outStr end -- function end
GetDiameterAndCentre
local StrTest = false StrTest = SwitchLetter(YourStr, "&") -- Non frendly File Name letters StrTest = SwitchLetter(YourStr, "#") StrTest = SwitchLetter(YourStr, "@") StrTest = SwitchLetter(YourStr, "^") StrTest = SwitchLetter(YourStr, "$") return outStr end -- function end
MakeHTMLReady()
function MakeHTMLReady(MyStr) -- fix's string with special bite chars for HTML local function SwitchLetter(MyStr, MyChar, NewStr) local outStr, str1 = "" local inStrLen = string.len(MyStr) for i = 1, inStrLen ,1 do str1 = string.sub(MyStr, i, i) if string.byte(str1) == string.byte(MyChar) then outStr=outStr .. NewStr else outStr=outStr .. str1 end end return outStr end -- function end
SwitchLetterTest
function SwitchLetterTest(MyStr) local outStr = "" outStr = SwitchLetter(MyStr, "!", "!") outStr = SwitchLetter(outStr, "#", "#") outStr = SwitchLetter(outStr, "$", "$") outStr = SwitchLetter(outStr, "%", "%") outStr = SwitchLetter(outStr, "&", "&") outStr = SwitchLetter(outStr, "'", "'") outStr = SwitchLetter(outStr, "(", "(") outStr = SwitchLetter(outStr, ")", ")") outStr = SwitchLetter(outStr, "*", "*") outStr = SwitchLetter(outStr, "+", "+") outStr = SwitchLetter(outStr, ",", ",") outStr = SwitchLetter(outStr, "-", "-") outStr = SwitchLetter(outStr, ".", ".") outStr = SwitchLetter(outStr, "/", "/") outStr = SwitchLetter(outStr, ":", ":") outStr = SwitchLetter(outStr, ";", ";") outStr = SwitchLetter(outStr, "<", "<") outStr = SwitchLetter(outStr, "=", "=") outStr = SwitchLetter(outStr, ">", ">") outStr = SwitchLetter(outStr, "?", "?") outStr = SwitchLetter(outStr, "@", "@") outStr = SwitchLetter(outStr, "[", "[") outStr = SwitchLetter(outStr, "]", "]") outStr = SwitchLetter(outStr, "^", "^") outStr = SwitchLetter(outStr, "_", "_") outStr = SwitchLetter(outStr, "`", "`") outStr = SwitchLetter(outStr, "{", "{") outStr = SwitchLetter(outStr, "|", "|") outStr = SwitchLetter(outStr, "}", "}") outStr = SwitchLetter(outStr, "~", "~") return outStr end -- function end
SwitchLetter()
function SwitchLetter(MyStr, MyChar, NewStr) -- swwap a leter for another letter local outStr, str1 = "" local inStrLen = string.len(MyStr) for i = 1, inStrLen ,1 do str1 = string.sub(MyStr, i, i) if string.byte(str1) == string.byte(MyChar) then outStr=outStr .. NewStr else outStr=outStr .. str1 end end return outStr end -- function end
PadC
function PadC(str, lenth) -- Adds spaces to front and back to center text in lenth -- Local Word = PadC("K", 12) -- returns " K " if type(str) ~= "string" then str = tostring(str) end if string.len(str) < lenth then local a = math.floor(lenth - string.len(str) * 0.5) - 2 local b = math.ceil(lenth - string.len(str) * 0.5) - 2 --print ("a = " .. a) for _ = 1, a, 1 do str = " " .. str end for _ = 1, b, 1 do str = str .. " " end --print ("str len = " .. #str) end return str end -- function end
PadR()
function PadR(str, len) -- Adds spaces to Back of string -- Local Word = Pad("KPSDFKSPSK", 12) -- returns "KPSDFKSPSK " if type(str) ~= "string" then str = tostring(str) end while string.len(str) < len do str = str .. " " end return str end -- function end
PadL()
function PadL(str, len) -- Adds spaces to Front of string -- Local Word = Pad("KPSDFKSPSK", 12) -- returns " KPSDFKSPSK" if type(str) ~= "string" then str = tostring(str) end while string.len(str) < len do str = " " .. str end return str end -- function end
NumberPad()
function NumberPad(str, front, back) -- Adds spaces to front and zeros to the back of string local mychar local a,b,c,d = 0,0,0,0 local x,y,z = "","","" if type(str) ~= "string" then str = tostring(str) end c = string.len(str) for i = 1, c, 1 do mychar = string.byte(string.sub(str, i,i)) if mychar == 46 then b = i end end -- print("b = " .. b) if b == 0 then str = str .. "." c = c + 1 b = c end -- if loc x = string.sub(str, 1, b-1) y = string.sub(str, b+1) a = c - b a = #x d = #y if a < front then front = front - (a - 1) for _ = 1, front -1 do x = " " .. x end -- end for front end back = back - (c - b) for i = 1, back do y = y .. "0" end -- end for back str = x .. "." .. y return str end -- function end
All_Trim()
function All_Trim(s) -- Trims spaces off both ends of a string return s:match( "^%s*(.-)%s*$" ) end -- function end
MakeProperCase()
function MakeProperCase(str) local str=string.gsub(string.lower(str),"^(%w)", string.upper) return string.gsub(str,"([^%w]%w)", string.upper) end
ifT()
function ifT(x) -- Converts Boolean True or False to String "Yes" or "No" -- ===ifT(x)=== if x then return "Yes" else return "No" end-- if end end -- function end
ifY()
function ifY(x) -- Converts String "Yes" or "No" to Boolean True or False -- ===ifY(x)=== if string.upper(x) == "YES" then return true else return false end-- if end end -- function end
Seed Documents
This object is a name-value pair that represents a Document Variable within a VectricJob.
-- =====================================================]] ╔═╗╔═╗╔═╗╔╦╗ ╔═╗╦ ╦╔╗╔╔═╗╔╦╗╦╔═╗╔╗╔ ╚═╗║╣ ║╣ ║║ ╠╣ ║ ║║║║║ ║ ║║ ║║║║ ╚═╝╚═╝╚═╝═╩╝ ╚ ╚═╝╝╚╝╚═╝ ╩ ╩╚═╝╝╚╝ -- =====================================================]] -- VECTRIC LUA SCRIPT -- =====================================================]] -- Gadgets are an entirely optional add-in to Vectric's core software products. -- They are provided 'as-is', without any express or implied warranty, and you make use of them entirely at your own risk. -- In no event will the author(s) or Vectric Ltd. be held liable for any damages arising from their use. -- Permission is granted to anyone to use this software for any purpose, -- including commercial applications, and to alter it and redistribute it freely, -- subject to the following restrictions: -- 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. -- 2. If you use this software in a product, an acknowledgement in the product documentation would be appreciated but is not required. -- 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -- 4. This notice may not be removed or altered from any source distribution. -- Easy Seed Gadget Master is written by Jim Anderson of Houston Texas 2020 -- =====================================================]] -- require("mobdebug").start() -- require "strict" local Tools -- Global Variables -- local Ver = "1.0" -- Version 7: Aug 2021 - Clean Up and added Ver to Dialog -- Table Names Milling = {} Project = {} -- =====================================================]] function main(script_path) --[[ Gadget Notes: Dec 2019 - My New Gadget ]] -- Localized Variables -- -- Job Validation -- local job = VectricJob() if not job.Exists then DisplayMessageBox("Error: No job loaded") return false end Tools = assert(loadfile(script_path .. "\\EasyGearToolsVer" .. Ver .. ".xlua")) (Tools) -- Load Tool Function -- Get Data -- -- Calculation -- -- Do Something -- return true end -- function end
Setup Tools
This object is a name-value pair that represents a Document Variable within a VectricJob.
-- =====================================================]] ╔═╗╔═╗╔╦╗╦ ╦╔═╗ ╚═╗║╣ ║ ║ ║╠═╝ ╚═╝╚═╝ ╩ ╚═╝╩ function SetupAndLetter Seeds() -- =====================================================]] function LUA_Seed() -- VECTRIC LUA SCRIPT -- ============================================================================== -- Gadgets are an entirely optional add-in to Vectric's core software products. -- They are provided 'as-is', without any express or implied warranty, and you -- make use of them entirely at your own risk. -- In no event will the author(s) or Vectric Ltd. be held liable for any damages -- arising from their use. -- Permission is granted to anyone to use this software for any purpose, -- including commercial applications, and to alter it and redistribute it freely, -- subject to the following restrictions: -- 1. The origin of this software must not be misrepresented; -- you must not claim that you wrote the original software. -- If you use this software in a product, an acknowledgement in the product -- documentation would be appreciated but is not required. -- 2. Altered source versions must be plainly marked as such, and -- must not be misrepresented as being the original software. -- 3. This notice may not be removed or altered from any source distribution. -- ============================================================================== -- "AppName Here" was written by JimAndi Gadgets of Houston Texas -- ============================================================================== -- =====================================================]] -- require("mobdebug").start() -- require "strict" -- =====================================================]] -- Global variables -- =====================================================]] end -- lua function -- =====================================================]] function Install_letter() -- Steps to Install: -- 1. Download the gadget x.zip that is attached to this post. -- 2. Rename it from x.zip to x.vgadget -- 3. In Vectric Pro or Aspire click on Gadgets -> Install Gadget and navigate to where you downloaded the file to, select it and click Ok. -- It should give you a pop up saying the gadget was installed and you should see x in the Gadgets menu. -- Image Here -- Steps for Use: -- 1. Select a layer that you want to calculate for -- 2. Enter the cut depth -- 3. Enter the percentage of coverage for the area that will be filled in -- 4. Enter the hardner to resin percentage -- 5. Click the Calculate Button and the results will be displayed below in the Results Pane. end -- install function end -- Header function -- =====================================================]]
Toolpathing Tools
This object is a name-value pair that represents a Document Variable within a VectricJob.
CreateLayerProfileToolpath
function CreateLayerProfileToolpath(name, layer_name, start_depth, cut_depth, tool_dia, tool_stepdown, tool_in_mm) -- clear current selection local selection = job.Selection selection:Clear() -- get layer local layer = job.LayerManager:FindLayerWithName(layer_name) if layer == nil then DisplayMessageBox("No layer found with name = " .. layer_name) return false end -- select all closed vectors on the layer if not SelectVectorsOnLayer(layer, selection, true, false, true) then DisplayMessageBox("No closed vectors found on layer " .. layer_name) return false end -- Create tool we will use to machine vectors local tool = Tool("Lua End Mill", Tool.END_MILL) -- BALL_NOSE, END_MILL, VBIT tool.InMM = tool_in_mm tool.ToolDia = tool_dia tool.Stepdown = tool_stepdown tool.Stepover = tool_dia * 0.25 tool.RateUnits = Tool.MM_SEC -- MM_SEC, MM_MIN, METRES_MIN, INCHES_SEC ... tool.FeedRate = 30 tool.PlungeRate = 10 tool.SpindleSpeed = 20000 tool.ToolNumber = 1 tool.VBit_Angle = 90.0 -- used for vbit only tool.ClearStepover = tool_dia * 0.5 -- used for vbit only -- Create object used to set home position and safez gap above material surface local pos_data = ToolpathPosData() pos_data:SetHomePosition(0, 0, 1.0) pos_data.SafeZGap = 5.0 -- Create object used to pass profile options local profile_data = ProfileParameterData() -- start depth for toolpath profile_data.StartDepth = start_depth -- cut depth for toolpath this is depth below start depth profile_data.CutDepth = cut_depth -- direction of cut - ProfileParameterData. -- CLIMB_DIRECTION or ProfileParameterData.CONVENTIONAL_DIRECTION profile_data.CutDirection = ProfileParameterData.CLIMB_DIRECTION -- side we machine on - ProfileParameterData. -- PROFILE_OUTSIDE, ProfileParameterData.PROFILE_INSIDE or -- ProfileParameterData.PROFILE_ON profile_data.ProfileSide = ProfileParameterData.PROFILE_OUTSIDE -- Allowance to leave on when machining profile_data.Allowance = 0.0 -- true to preserve start point positions, false to reorder start -- points to minimise toolpath length profile_data.KeepStartPoints = false -- true if want to create 'square' external corners on toolpath profile_data.CreateSquareCorners = false -- true to perform corner sharpening on internal corners (only with v-bits) profile_data.CornerSharpen = false -- true to use tabs (position of tabs must already have been defined on vectors) profile_data.UseTabs = false -- length for tabs if being used profile_data.TabLength = 5.0 -- Thickness for tabs if being used profile_data.TabThickness = 1.0 -- if true then create 3d tabs else 2d tabs profile_data.Use3dTabs = true -- if true in Aspire, project toolpath onto composite model profile_data.ProjectToolpath = false -- Create object used to control ramping local ramping_data = RampingData() -- if true we do ramping into toolpath ramping_data.DoRamping = false -- type of ramping to perform RampingData.RAMP_LINEAR , RampingData.RAMP_ZIG_ZAG -- or RampingData.RAMP_SPIRAL ramping_data.RampType = RampingData.RAMP_ZIG_ZAG -- how ramp is contrained - either by angle or distance RampingData.CONSTRAIN_DISTANCE -- or RampingData.CONSTRAIN_ANGLE ramping_data.RampConstraint = RampingData.CONSTRAIN_ANGLE -- if we are constraining ramp by distance, distance to ramp over ramping_data.RampDistance = 100.0 -- if we are contraining ramp by angle , angle to ramp in at (in degrees) ramping_data.RampAngle = 25.0 -- if we are contraining ramp by angle, max distance to travel before 'zig zaging' -- if zig zaging ramping_data.RampMaxAngleDist = 15 -- if true we restrict our ramping to lead in section of toolpath ramping_data.RampOnLeadIn = false -- Create object used to control lead in/out local lead_in_out_data = LeadInOutData() -- if true we create lead ins on profiles (not for profile on) lead_in_out_data.DoLeadIn = false -- if true we create lead outs on profiles (not for profile on) lead_in_out_data.DoLeadOut = false -- type of leads to create LeadInOutData.LINEAR_LEAD or LeadInOutData.CIRCULAR_LEAD lead_in_out_data.LeadType = LeadInOutData.CIRCULAR_LEAD -- length of lead to create lead_in_out_data.LeadLength = 10.0 -- Angle for linear leads lead_in_out_data.LinearLeadAngle = 45 -- Radius for circular arc leads lead_in_out_data.CirularLeadRadius = 5.0 -- distance to 'overcut' (travel past start point) when profiling lead_in_out_data.OvercutDistance = 0.0 -- Create object which can be used to automatically select geometry local geometry_selector = GeometrySelector() -- if this is true we create 2d toolpaths previews in 2d view, if false we dont local create_2d_previews = true -- if this is true we will display errors and warning to the user local display_warnings = true -- Create our toolpath local toolpath_manager = ToolpathManager() local toolpath_id = toolpath_manager:CreateProfilingToolpath(name, tool, profile_data, ramping_data, lead_in_out_data, pos_data, geometry_selector, create_2d_previews, display_warnings ) if toolpath_id == nil then DisplayMessageBox("Error creating toolpath") return false end return true end -- end function
CreateProfileToolpath
function CreateProfileToolpath(name, start_depth, cut_depth, tool_dia, tool_stepdown, tool_in_mm) -- Create tool we will use to machine vectors local tool = Tool("Lua End Mill", Tool.END_MILL) -- BALL_NOSE, END_MILL, VBIT tool.InMM = tool_in_mm tool.ToolDia = tool_dia tool.Stepdown = tool_stepdown tool.Stepover = tool_dia * 0.25 tool.RateUnits = Tool.MM_SEC -- MM_SEC, MM_MIN, METRES_MIN, INCHES_SEC ... tool.FeedRate = 30 tool.PlungeRate = 10 tool.SpindleSpeed = 20000 tool.ToolNumber = 1 tool.VBit_Angle = 90.0 -- used for vbit only tool.ClearStepover = tool_dia * 0.5 -- used for vbit only -- Create object used to set home position and safez gap above material surface local pos_data = ToolpathPosData() pos_data:SetHomePosition(0, 0, 1.0) pos_data.SafeZGap = 5.0 -- Create object used to pass profile options local profile_data = ProfileParameterData() -- start depth for toolpath profile_data.StartDepth = start_depth -- cut depth for toolpath this is depth below start depth profile_data.CutDepth = cut_depth -- direction of cut - ProfileParameterData. -- CLIMB_DIRECTION or ProfileParameterData.CONVENTIONAL_DIRECTION profile_data.CutDirection = ProfileParameterData.CLIMB_DIRECTION -- side we machine on - ProfileParameterData. -- PROFILE_OUTSIDE, ProfileParameterData.PROFILE_INSIDE or -- ProfileParameterData.PROFILE_ON profile_data.ProfileSide = ProfileParameterData.PROFILE_OUTSIDE -- Allowance to leave on when machining profile_data.Allowance = 0.0 -- true to preserve start point positions, false to reorder start -- points to minimise toolpath length profile_data.KeepStartPoints = false -- true if want to create 'square' external corners on toolpath profile_data.CreateSquareCorners = false -- true to perform corner sharpening on internal corners (only with v-bits) profile_data.CornerSharpen = false -- true to use tabs (position of tabs must already have been defined on vectors) profile_data.UseTabs = false -- length for tabs if being used profile_data.TabLength = 5.0 -- Thickness for tabs if being used profile_data.TabThickness = 1.0 -- if true then create 3d tabs else 2d tabs profile_data.Use3dTabs = true -- if true in Aspire, project toolpath onto composite model profile_data.ProjectToolpath = false -- Create object used to control ramping local ramping_data = RampingData() -- if true we do ramping into toolpath ramping_data.DoRamping = false -- type of ramping to perform RampingData.RAMP_LINEAR , RampingData.RAMP_ZIG_ZAG -- or RampingData.RAMP_SPIRAL ramping_data.RampType = RampingData.RAMP_ZIG_ZAG -- how ramp is contrained - either by angle or distance RampingData.CONSTRAIN_DISTANCE -- or RampingData.CONSTRAIN_ANGLE ramping_data.RampConstraint = RampingData.CONSTRAIN_ANGLE -- if we are constraining ramp by distance, distance to ramp over ramping_data.RampDistance = 100.0 -- if we are contraining ramp by angle , angle to ramp in at (in degrees) ramping_data.RampAngle = 25.0 -- if we are contraining ramp by angle, max distance to travel before 'zig zaging' -- if zig zaging ramping_data.RampMaxAngleDist = 15 -- if true we restrict our ramping to lead in section of toolpath ramping_data.RampOnLeadIn = false -- Create object used to control lead in/out local lead_in_out_data = LeadInOutData() -- if true we create lead ins on profiles (not for profile on) lead_in_out_data.DoLeadIn = false -- if true we create lead outs on profiles (not for profile on) lead_in_out_data.DoLeadOut = false -- type of leads to create LeadInOutData.LINEAR_LEAD or LeadInOutData.CIRCULAR_LEAD lead_in_out_data.LeadType = LeadInOutData.CIRCULAR_LEAD -- length of lead to create lead_in_out_data.LeadLength = 10.0 -- Angle for linear leads lead_in_out_data.LinearLeadAngle = 45 -- Radius for circular arc leads lead_in_out_data.CirularLeadRadius = 5.0 -- distance to 'overcut' (travel past start point) when profiling lead_in_out_data.OvercutDistance = 0.0 -- Create object which can be used to automatically select geometry local geometry_selector = GeometrySelector() -- if this is true we create 2d toolpaths previews in 2d view, if false we dont local create_2d_previews = true -- if this is true we will display errors and warning to the user local display_warnings = true -- Create our toolpath local toolpath_manager = ToolpathManager() local toolpath_id = toolpath_manager:CreateProfilingToolpath(name, tool, profile_data, ramping_data, lead_in_out_data, pos_data, geometry_selector, create_2d_previews, display_warnings ) if toolpath_id == nil then DisplayMessageBox("Error creating toolpath") return false end return true end -- end function
CreatePocketingToolpath
function CreatePocketingToolpath(name, start_depth, cut_depth, tool_dia, tool_stepdown, tool_stepover_percent, tool_in_mm) -- Create tool we will use to machine vectors local tool = Tool("Lua End Mill",Tool.END_MILL) -- BALL_NOSE, END_MILL, VBIT tool.InMM = tool_in_mm tool.ToolDia = tool_dia tool.Stepdown = tool_stepdown tool.Stepover = tool_dia * (tool_stepover_percent / 100) tool.RateUnits = Tool.MM_SEC -- MM_SEC, MM_MIN, METRES_MIN, INCHES_SEC,... tool.FeedRate = 30 tool.PlungeRate = 10 tool.SpindleSpeed = 20000 tool.ToolNumber = 1 tool.VBit_Angle = 90.0 -- used for vbit only tool.ClearStepover = tool_dia * (tool_stepover_percent / 100) -- used for vbit only -- Create object used to set home position and safez gap above material surface local pos_data = ToolpathPosData() pos_data:SetHomePosition(0, 0, 1.0) pos_data.SafeZGap = 5.0 -- Create object used to pass pocketing options local pocket_data = PocketParameterData() -- start depth for toolpath pocket_data.StartDepth = start_depth -- cut depth for toolpath this is depth below start depth pocket_data.CutDepth = cut_depth -- direction of cut for offet clearance - ProfileParameterData.CLIMB_DIRECTION or -- ProfileParameterData.CONVENTIONAL_DIRECTION - NOTE: enum from ProfileParameterData pocket_data.CutDirection = ProfileParameterData.CLIMB_DIRECTION -- Allowance to leave on when machining pocket_data.Allowance = 0.0 -- if true use raster clearance strategy , else use offset area clearance pocket_data.DoRasterClearance = true -- angle for raster if using raster clearance pocket_data.RasterAngle = 0 -- type of profile pass to perform PocketParameterData.PROFILE_NONE , -- PocketParameterData.PROFILE_FIRST orPocketParameterData.PROFILE_LAST pocket_data.ProfilePassType = PocketParameterData.PROFILE_LAST -- if true we ramp into pockets (always zig-zag) pocket_data.DoRamping = false -- if ramping, distance to ramp over pocket_data.RampDistance = 10.0 -- if true in Aspire, project toolpath onto composite model pocket_data.ProjectToolpath = false -- Create object which can be used to automatically select geometry local geometry_selector = GeometrySelector() -- if this is true we create 2d toolpaths previews in 2d view, if false we dont local create_2d_previews = true -- if this is true we will display errors and warning to the user local display_warnings = true -- if we are doing two tool pocketing define tool to use for area clearance local area_clear_tool = nill -- we just create a tool twice as large for testing here area_clear_tool = Tool("Lua Clearance End Mill", Tool.END_MILL) -- BALL_NOSE, END_MILL, VBIT area_clear_tool.InMM = tool_in_mm area_clear_tool.ToolDia = tool_dia * 2 area_clear_tool.Stepdown = tool_stepdown * 2 area_clear_tool.Stepover = tool_dia * 2 *(tool_stepover_percent / 100) area_clear_tool.RateUnits = Tool.MM_SEC -- MM_SEC, MM_MIN, METRES_MIN, INCHES_SEC.. area_clear_tool.FeedRate = 30 area_clear_tool.PlungeRate = 10 area_clear_tool.SpindleSpeed = 20000 area_clear_tool.ToolNumber = 1 area_clear_tool.VBit_Angle = 90.0 -- used for vbit only area_clear_tool.ClearStepover = tool_dia*2*(tool_stepover_percent/100) -- used for vbit -- Create our toolpath local toolpath_manager = ToolpathManager() local toolpath_id = toolpath_manager:CreatePocketingToolpath(name,tool,area_clear_tool,pocket_data,pos_data,geometry_selector,create_2d_previews,display_warnings) if toolpath_id == nill then DisplayMessageBox("Error creating toolpath") return false end return true end -- end function
CreateDrillingToolpath
function CreateDrillingToolpath(name, start_depth, cut_depth, retract_gap, tool_dia, tool_stepdown, tool_in_mm) -- Create tool we will use to machine vectors local tool = Tool("Lua Drill", Tool.THROUGH_DRILL) -- BALL_NOSE, END_MILL, VBIT, THROUGH_DRILL tool.InMM = tool_in_mm tool.ToolDia = tool_dia tool.Stepdown = tool_stepdown tool.Stepover = tool_dia * 0.25 tool.RateUnits = Tool.MM_SEC -- MM_SEC, MM_MIN, METRES_MIN, INCHES_SEC, INCHES_MIN, FEET_MIN tool.FeedRate = 30 tool.PlungeRate = 10 tool.SpindleSpeed = 20000 tool.ToolNumber = 1 tool.VBit_Angle = 90.0 -- used for vbit only tool.ClearStepover = tool_dia * 0.5 -- used for vbit only -- Create object used to set home position and safez gap above material surface local pos_data = ToolpathPosData() pos_data:SetHomePosition(0, 0, 1.0) pos_data.SafeZGap = 5.0 -- Create object used to pass profile options local drill_data = DrillParameterData() -- start depth for toolpath drill_data.StartDepth = start_depth -- cut depth for toolpath this is depth below start depth drill_data.CutDepth = cut_depth -- if true perform peck drilling drill_data.DoPeckDrill = retract_gap > 0.0 -- distance to retract above surface when peck drilling drill_data.PeckRetractGap = retract_gap -- if true in Aspire, project toolpath onto composite model drill_data.ProjectToolpath = false -- Create object which can be used to automatically select geometry local geometry_selector = GeometrySelector() -- if this is true we create 2d toolpaths previews in 2d view, -- if false we dont local create_2d_previews = true -- if this is true we will display errors and warning to the user local display_warnings = true -- Create our toolpath local toolpath_manager = ToolpathManager() local toolpath_id = toolpath_manager:CreateDrillingToolpath(name,tool,drill_data,pos_data,geometry_selector,create_2d_previews,display_warnings) if toolpath_id == nil then DisplayMessageBox("Error creating toolpath") return false end return true end -- end function
CreateVCarvingToolpath
function CreateVCarvingToolpath(name, start_depth, flat_depth, vbit_angle, vbit_dia, vbit_stepdown, tool_stepover_percent, tool_in_mm) --[[ -------------- CreateVCarvingToolpath -------------- | | Create a VCarving toolpath within the program for the currently selected vectors | Parameters: | name, -- Name for toolpath | start_depth -- Start depth for toolpath below surface of material | flat_depth -- flat depth - if 0.0 assume not doing flat bottom | vbit_angle -- angle of vbit to use | vbit_dia -- diameter of VBit to use | vbit_stepdown -- stepdown for tool | tool_stepover_percent - percentage stepover for tool | tool_in_mm -- true if tool size and stepdown are in mm | | Return Values: | true if toolpath created OK else false | ]] -- Create tool we will use to machine vectors local tool = Tool("Lua VBit",Tool.VBIT )-- BALL_NOSE, END_MILL, VBIT tool.InMM = tool_in_mm tool.ToolDia = vbit_dia tool.Stepdown = vbit_stepdown tool.Stepover = vbit_dia * (tool_stepover_percent / 100) tool.RateUnits = Tool.MM_SEC -- MM_SEC, MM_MIN, METRES_MIN, INCHES_SEC, INCHES_MIN, FEET_MIN tool.FeedRate = 30 tool.PlungeRate = 10 tool.SpindleSpeed = 20000 tool.ToolNumber = 1 tool.VBit_Angle = 90.0 -- used for vbit only tool.ClearStepover = vbit_dia * (tool_stepover_percent / 100) * 2 -- used for vbit only -- Create object used to set home position and safez gap above material surface local pos_data = ToolpathPosData() vcarve_data:SetHomePosition(Milling.HomeX, Milling.HomeY, Milling.HomeZGap ) -- vcarve_data:SetHomePosition(0, 0, 1.0) vcarve_data.SafeZGap = Milling.SafeZGap -- vcarve_data.SafeZGap = 0.5 local vcarve_data = VCarveParameterData() -- Create object used to pass pocketing options - used for area clearance only vcarve_data.StartDepth = start_depth -- start depth for toolpath vcarve_data.DoFlatBottom = flat_depth > 0.0 -- flag indicating if we are creating a flat bottomed toolpath vcarve_data.FlatDepth = flat_depth -- cut depth for toolpath this is depth below start depth vcarve_data.ProjectToolpath = false -- if true in Aspire, project toolpath onto composite model vcarve_data.UseAreaClearTool = true -- set flag indicating we are using flat tool local pocket_data = PocketParameterData() -- Create object used to pass pocketing options - used for area clearance only pocket_data.StartDepth = start_depth -- start depth for toolpath pocket_data.CutDepth = flat_depth -- cut depth for toolpath this is depth below start depth pocket_data.CutDirection = ProfileParameterData.CLIMB_DIRECTION -- direction of cut for offet clearance - ProfileParameterData.CLIMB_DIRECTION or ProfileParameterData.CONVENTIONAL_DIRECTION - NOTE: enum from ProfileParameterData -- if true use raster clearance strategy , else use offset area clearance pocket_data.DoRasterClearance = false -- set flag indicating we are using flat tool pocket_data.UseAreaClearTool = true -- angle for raster if using raster clearance pocket_data.RasterAngle = 0 -- type of profile pass to perform PocketParameterData.PROFILE_NONE , -- PocketParameterData.PROFILE_FIRST orPocketParameterData.PROFILE_LAST pocket_data.ProfilePassType = PocketParameterData.PROFILE_LAST -- if this is true we create 2d toolpaths previews in 2d view, if false we dont local create_2d_previews = true -- if this is true we will display errors and warning to the user local display_warnings = true -- if we are doing two tool pocketing define tool to use for area clearance local area_clear_tool = nil -- we just create a 10mm end mill area_clear_tool = Tool("Lua Clearance End Mill",Tool.END_MILL) -- BALL_NOSE, END_MILL, VBIT area_clear_tool.InMM = true area_clear_tool.ToolDia = 10 area_clear_tool.Stepdown = 3 area_clear_tool.Stepover = 3 area_clear_tool.RateUnits = Tool.MM_SEC -- MM_SEC, MM_MIN, METRES_MIN, INCHES_SEC, INCHES_MIN, FEET_MIN area_clear_tool.FeedRate = 30 area_clear_tool.PlungeRate = 10 area_clear_tool.SpindleSpeed = 20000 area_clear_tool.ToolNumber = 2 local geometry_selector = GeometrySelector() -- Create object which can be used to automatically select geometry -- Create our toolpath local toolpath_manager = ToolpathManager() local toolpath_id = toolpath_manager:CreateVCarvingToolpath(name,tool, area_clear_tool,vcarve_data, pocket_data,pos_data,geometry_selector, create_2d_previews,display_warnings) if toolpath_id == nil then DisplayMessageBox("Error creating toolpath") return false end return true end -- end function
CreatePrismToolpath
function CreatePrismToolpath(name, start_depth, cut_depth, vbit_angle, vbit_dia, vbit_stepdown, tool_stepover_percent, tool_in_mm) --[[ ------------------- CreatePrismToolpath ------------------- | | Create a prism toolpath within the program for the currently selected vectors | Parameters: | name, -- Name for toolpath | start_depth -- Start depth for toolpath below surface of material | cut_depth -- cut depth for drilling toolpath | vbit_angle -- angle of vbit to use | vbit_dia -- diameter of VBit to use | vbit_stepdown -- stepdown for tool | tool_stepover_percent - percentage stepover for tool | tool_in_mm -- true if tool size and stepdown are in mm | | Return Values: | true if toolpath created OK else false | ]] -- Create tool we will use to machine vectors local tool = Tool("Lua VBit", Tool.VBIT ) -- BALL_NOSE, END_MILL, VBIT tool.InMM = tool_in_mm tool.ToolDia = vbit_dia tool.Stepdown = vbit_stepdown tool.Stepover = vbit_dia * (tool_stepover_percent / 100) tool.RateUnits = Tool.MM_SEC -- MM_SEC, MM_MIN, METRES_MIN, INCHES_SEC, INCHES_MIN, FEET_MIN tool.FeedRate = 30 tool.PlungeRate = 10 tool.SpindleSpeed = 20000 tool.ToolNumber = 1 tool.VBit_Angle = 90.0 -- used for vbit only tool.ClearStepover = vbit_dia * (tool_stepover_percent / 100) * 2 -- used for vbit only -- Create object used to set home position and safez gap above material surface local pos_data = ToolpathPosData() pos_data:SetHomePosition(0, 0, 1.0) pos_data.SafeZGap = 5.0 -- Create object used to pass profile options local prism_data = PrismCarveParameterData() -- start depth for toolpath prism_data.StartDepth = start_depth -- cut depth for toolpath this is depth below start depth prism_data.CutDepth = cut_depth -- direction of cut for offet clearance - ProfileParameterData.CLIMB_DIRECTION -- or ProfileParameterData.CONVENTIONAL_DIRECTION - NOTE: enum from ProfileParameterData prism_data.CutDirection = ProfileParameterData.CLIMB_DIRECTION -- calculate the minimum cut depth to fully form the bevel on the current -- selection with the current tool local min_bevel_depth = prism_data:CalculateMinimumBevelDepth(tool, true) if min_bevel_depth > cut_depth then DisplayMessageBox("A prism will not be fully formed with a depth of " .. cut_depth .. "\r\n" .. "A depth of " .. min_bevel_depth .. " is required to fully form the prism") end -- if end -- Create object which can be used to automatically select geometry local geometry_selector = GeometrySelector() -- if this is true we create 2d toolpaths previews in 2d view, if false we dont local create_2d_previews = true -- if this is true we will display errors and warning to the user local display_warnings = true -- Create our toolpath local toolpath_manager = ToolpathManager() local toolpath_id = toolpath_manager:CreatePrismCarvingToolpath(name, tool, prism_data, pos_data, geometry_selector, create_2d_previews, display_warnings) if toolpath_id == nil then DisplayMessageBox("Error creating toolpath") return false end -- if end return true end -- end function
CreateFlutingToolpath
function CreateFlutingToolpath(name, start_depth, cut_depth, tool_dia, tool_stepdown, tool_in_mm) --[[ ----------------- CreateFlutingToolpath ----------------- | Create a flutting toolpath within the program for the currently selected vectors | Parameters: | name, -- Name for toolpath | start_depth -- Start depth for toolpath below surface of material | cut_depth -- cut depth for toolpath | tool_dia -- diameter of tool to use | tool_stepdown -- stepdown for tool | tool_in_mm -- true if tool size and stepdown are in mm | | Return Values: | true if toolpath created OK else false | ]] -- Create tool we will use to machine vectors local tool = Tool("Lua Ball Nose", Tool.BALL_NOSE) -- BALL_NOSE, END_MILL, VBIT, THROUGH_DRILL tool.InMM = tool_in_mm tool.ToolDia = tool_dia tool.Stepdown = tool_stepdown tool.Stepover = tool_dia * 0.25 tool.RateUnits = Tool.MM_SEC -- MM_SEC, MM_MIN, METRES_MIN, INCHES_SEC, INCHES_MIN, FEET_MIN tool.FeedRate = 30 tool.PlungeRate = 10 tool.SpindleSpeed = 20000 tool.ToolNumber = 1 tool.VBit_Angle = 90.0 -- used for vbit only tool.ClearStepover = tool_dia * 0.5 -- used for vbit only -- Create object used to set home position and safez gap above material surface local pos_data = ToolpathPosData() pos_data:SetHomePosition(0, 0, 1.0) pos_data.SafeZGap = 5.0 -- Create object used to pass fluting options local fluting_data = FlutingParameterData() -- start depth for toolpath fluting_data.StartDepth = start_depth -- cut depth for toolpath this is depth below start depth fluting_data.CutDepth = cut_depth -- type of fluting FULL_LENGTH, RAMP_START or RAMP_START_END fluting_data.FluteType = FlutingParameterData.RAMP_START_END -- type of ramping RAMP_LINEAR, RAMP_SMOOTH fluting_data.RampType = FlutingParameterData.RAMP_LINEAR -- if true use ratio field for controling ramp length else absolute length value fluting_data.UseRampRatio = false -- length of ramp as ratio of flute length(range 0 - 1.0) -- (for start and end - ratio is of half length) fluting_data.RampRatio = 0.2 -- length to ramp over - if UseRampRatio == false fluting_data.RampLength = 15 -- if true in Aspire, project toolpath onto composite model fluting_data.ProjectToolpath = false -- Create object which can be used to automatically select geometry local geometry_selector = GeometrySelector() -- if this is true we create 2d toolpaths previews in 2d view, if false we dont local create_2d_previews = true -- if this is true we will display errors and warning to the user local display_warnings = true -- Create our toolpath local toolpath_manager = ToolpathManager() local toolpath_id = toolpath_manager:CreateFlutingToolpath(name, tool, fluting_data, pos_data, geometry_selector, create_2d_previews, display_warnings) if toolpath_id == nil then DisplayMessageBox("Error creating toolpath") return false else return true end end -- end function
SelectVectorsOnLayer
function SelectVectorsOnLayer(layer, selection, select_closed, select_open, select_groups) -- Please Note: SelectVectorsOnLayer is provided by Vectric and can be found in the SDK and Sample Gadget files. --[[ ---------------- SelectVectorsOnLayer ---------------- -- | SelectVectorsOnLayer("Stringer Profile", selection, true, falus, falus) -- | Add all the vectors on the layer to the selection -- | layer, -- layer we are selecting vectors on -- | selection -- selection object -- | select_closed -- if true select closed objects -- | select_open -- if true select open objects -- | select_groups -- if true select grouped vectors (irrespective of open / closed state of member objects) -- | Return Values: -- | true if selected one or more vectors| --]] local objects_selected = false local warning_displayed = false local pos = layer:GetHeadPosition() while pos ~= nil do local object object, pos = layer:GetNext(pos) local contour = object:GetContour() if contour == nil then if (object.ClassName == "vcCadObjectGroup") and select_groups then selection:Add(object, true, true) objects_selected = true else if not warning_displayed then local message = "Object(s) without contour information found on layer - ignoring" if not select_groups then message = message .. "\r\n\r\n" .. "If layer contains grouped vectors these must be ungrouped for this script" end -- if end DisplayMessageBox(message) warning_displayed = true end -- if end end -- if end else -- contour was NOT nil, test if Open or Closed if contour.IsOpen and select_open then selection:Add(object, true, true) objects_selected = true elseif select_closed then selection:Add(object, true, true) objects_selected = true end -- if end end -- if end end -- while end -- to avoid excessive redrawing etc we added vectors to the selection in 'batch' mode -- tell selection we have now finished updating if objects_selected then selection:GroupSelectionFinished() end -- if end return objects_selected end -- function end
References
Please Note: The base material for the contents found in this WiKi was sourced from Vectric Lua Interface for Gadgets, version 10.0, published August 21, 2019. by Vectric Ltd. Most current document from Vertric can be downloaded at Vertric Developer Information