LDBoxer - Michael Horvath - 2016-08-27
I was wondering if someone could take a look at the source code to this program:
https://sourceforge.net/projects/ldrawboxer/
Currently it is not working properly for me. I used it in the past, so I know it *can* work. The developer said it might have something to do with long file names. He also said he is not feeling well, so he may not work on it any more.
Does anyone here have Delphi and can update the code? It is not a large program. If it was FreePascal I might take a stab at it myself.
Bonus feature request: I would also like to be able to use this tool from the command line, since I have a directory full of models that need to be converted.
Thanks everyone!
RE: LDBoxer - Michael Horvath - 2016-08-27
Here's my path to LDBoxer:
Code: E:\Programs Windows\LDraw\ldboxer\LDBoxer2010a.exe
Here's my path to %LDRAWDIR%:
Code: C:\Users\Public\Documents\LDraw\parts
Here's the path to my model:
Code: D:\Datsville\datsville_boxed_half\building_057_castletavern.ldr
I am able to load the model in LDBoxer, but am unable to process the file. LDBoxer does nothing when I press the AutoCheck button.
Looking at the program source code, can you see what might be causing this?
RE: LDBoxer - Michael Horvath - 2016-08-27
Okay, the problem was that the "ldraw.ini" file was not set correctly. Once I set it correctly the program worked.
Is this file obsolete? What is the replacement method of finding the LDraw directory?
RE: LDBoxer - Jarema - 2017-03-16
I did acting version of the command line. However, before it delivers. I wanted to ask for access to the file before | after modification via LDraw Boxer, to make sure that my version works just as well as the original.
RE: LDBoxer - Michael Horvath - 2017-03-16
(2017-03-16, 20:54)Jarema Wrote: I did acting version of the command line. However, before it delivers. I wanted to ask for access to the file before | after modification via LDraw Boxer, to make sure that my version works just as well as the original.
I don't understand what you are saying. I'm sorry.
RE: LDBoxer - Jarema - 2017-03-17
I'm sorry for you too. So give me this file(s) that you use with tool before covered it. And I check by my self how my version work. OK.
RE: LDBoxer - Jarema - 2017-03-18
I created repository for this utility here: https://github.com/Jeremy1980/LDBoxer
RE: LDBoxer - Michael Horvath - 2017-04-09
(2017-03-18, 13:30)Jarema Wrote: I created repository for this utility here: https://github.com/Jeremy1980/LDBoxer
I have more boxes here:
http://www.mediafire.com/file/dc1sx16tw2aegrt/ldr_boxes_mike_20170409.zip
Mike
RE: LDBoxer - Michael Horvath - 2018-01-07
(2017-03-18, 13:30)Jarema Wrote: I created repository for this utility here: https://github.com/Jeremy1980/LDBoxer
I forgot, but where do I put the box parts? Are the box parts the same as Tore Eriksson's?
Assuming they are located in:
"C:\Users\Public\Documents\LDraw\parts\b"
I am unable to process the following file:
http://www.mediafire.com/file/y56s7dj77vwq8os/datsville_rev519_boxed_half.zip
The program simply says "Boxed 0 parts" and then quits.
Could you take a look please?
RE: LDBoxer - Jarema - 2018-01-10
Roger that. I Take this in my free-time.
RE: LDBoxer - Michael Horvath - 2018-01-10
(2018-01-10, 7:41)Jarema Wrote: Roger that. I Take this in my free-time.
Thank you.
RE: LDBoxer - Michael Horvath - 2018-01-10
(2018-01-10, 7:41)Jarema Wrote: Roger that. I Take this in my free-time.
I have started fixing it myself, but the script now boxes every single part, so I must have made a mistake somewhere. Can you find the error?
Code: '''
Created on 16 mar 2017
Updated on 10 jan 2018
@author: Jeremy Czajkowski
@author: Tore Eriksson <[email protected]>
@author: Michael Horvath
@license: GNU General Public License version 3
@version: 2017c
@note: A utility to help you replace LDraw parts with no visible studs or tubes with boxes.
Saves rendering time and CPU power.
'''
import os
import sys
from macpath import dirname
__appname__ = "LDBoxer"
__version__ = "2017c"
NOTFOUND_MSG = "FileNotFoundError: [Errno 2] No such file or directory: '%s'"
INVALIDACCESS_MSG = "ImportError: Invalid access to %s."
CHKLST_INFILE = []
REPLACEDTOTAL_COUNT = 0
LDRAWPATH = MODELPATH = ""
def isBox(fil): # mjh
if fil[0:2].upper() == "B\\":
return True
else:
return False
def ldLineType(ldline):
result = -1;
s = ldline.strip()
if len(s)>0 :
if s[0]=='0' : result = 0 # mjh
if s[0]=='1' : result = 1 # mjh
if s[0]=='2' : result = 2 # mjh
if s[0]=='3' : result = 3 # mjh
if s[0]=='4' : result = 4 # mjh
if s[0]=='5' : result = 5 # mjh
return result
def ldLineUpdate(ldline, ItemNr, NewVal):
color1 = ldExtractFromLine(ldline, 2)
x1 = float(ldExtractFromLine(ldline, 3))
y1 = float(ldExtractFromLine(ldline, 4))
z1 = float(ldExtractFromLine(ldline, 5))
a1 = float(ldExtractFromLine(ldline, 6))
b1 = float(ldExtractFromLine(ldline, 7))
c1 = float(ldExtractFromLine(ldline, 8))
d1 = float(ldExtractFromLine(ldline, 9))
e1 = float(ldExtractFromLine(ldline, 10))
f1 = float(ldExtractFromLine(ldline, 11))
g1 = float(ldExtractFromLine(ldline, 12))
h1 = float(ldExtractFromLine(ldline, 13))
i1 = float(ldExtractFromLine(ldline, 14))
fil = ldExtractFromLine(ldline, 15)
if ItemNr == 2:
color1 = NewVal
if ItemNr == 3:
x1 = float(NewVal)
if ItemNr == 4:
y1 = float(NewVal)
if ItemNr == 5:
z1 = float(NewVal)
if ItemNr == 6:
a1 = float(NewVal)
if ItemNr == 7:
b1 = float(NewVal)
if ItemNr == 8:
c1 = float(NewVal)
if ItemNr == 9:
d1 = float(NewVal)
if ItemNr == 10:
e1 = float(NewVal)
if ItemNr == 11:
f1 = float(NewVal)
if ItemNr == 12:
g1 = float(NewVal)
if ItemNr == 13:
h1 = float(NewVal)
if ItemNr == 14:
i1 = float(NewVal)
if ItemNr == 15:
fil = NewVal
s = '1 ' + color1 + ' '
s = s + FloatToLDraw(x1)+ ' '
s = s + FloatToLDraw(y1)+ ' '
s = s + FloatToLDraw(z1)+ ' '
s = s + FloatToLDraw(a1)+ ' '
s = s + FloatToLDraw(b1)+ ' '
s = s + FloatToLDraw(c1)+ ' '
s = s + FloatToLDraw(d1)+ ' '
s = s + FloatToLDraw(e1)+ ' '
s = s + FloatToLDraw(f1)+ ' '
s = s + FloatToLDraw(g1)+ ' '
s = s + FloatToLDraw(h1)+ ' '
s = s + FloatToLDraw(i1)+ ' '
s = s + fil
return s
def ldExtractFromLine (ldline, post):
post -= 1 # mjh
t = []
s = ldline.strip()
iT = 0; # mjh
while s <> '':
s = s.strip() + ' '
i = 0 # mjh
while s[i] <> ' ': i += 1
# t[iT] = Copy(s, 1, i-1)
# function Copy(const S: string; From: integer = 1; Count: integer = MaxInt): string;
t.insert(iT, s[0:i]) # mjh
iT += 1
s = s[i+1:] # mjh
result = ''
if post < iT: result = t[post]
return result
def FloatToLDraw(inval):
if (inval > -0.0001) and (inval < 0.0001): inval = 0
return '%.5f' % (round(inval*10000)/10000)
def cmdReplace():
replacedCount = 0
for i in range(CHKLST_INFILE.__len__()):
ldline = CHKLST_INFILE[i]
if ldLineType(ldline) == 1 :
fil = ldExtractFromLine(ldline, 15)
if isBox(fil) == False : fil = strPrefix + fil
fname = os.path.join(LDRAWPATH ,'Parts' ,fil)
if os.path.exists(fname):
ldline = ldLineUpdate(ldline, 15, fil)
CHKLST_INFILE[i] = ldline + "\r\n"
replacedCount += 1;
global REPLACEDTOTAL_COUNT;
REPLACEDTOTAL_COUNT += 1;
if replacedCount>0 :
CHKLST_INFILE.append("0 // Boxed {0} parts ({1})\r\n".format(replacedCount ,strPrefix))
if __name__ == '__main__':
if sys.argv.__len__() != 3:
print "Invalid arguments"
sys.exit(2)
LDRAWPATH = sys.argv[1] # mjh, don't change
MODELPATH = sys.argv[2] # mjh, don't change
if not os.path.isdir(LDRAWPATH):
print NOTFOUND_MSG % LDRAWPATH
sys.exit(2)
if not os.path.isfile(MODELPATH):
print NOTFOUND_MSG % MODELPATH
sys.exit(2)
try:
with open(MODELPATH ,"r") as f:
for line in f:
CHKLST_INFILE.append(line)
f.close()
except:
CHKLST_INFILE = []
print INVALIDACCESS_MSG % MODELPATH
sys.exit(2)
else:
print __appname__ ,__version__ ,"processing" ,MODELPATH
i = ii = iii = frg = 0
x1 = y1 = z1 = a1 = c1 = g1 = i1 = x2 = y2 = z2 = x3 = y3 = z3 = 0.0
s = ldline = fil = ""
SkipThis = False
StrLstCover = []
StrListInfil = []
"""
cmdFittingsClick STEP 1: Compile a list of locations (20x20LDU)
Tops and Bottoms that are hiding (=covering) details from next part
Save the list in StrListCover
"""
for i in range(CHKLST_INFILE.__len__()):
ldline = CHKLST_INFILE[i]
if ldLineType(ldline) <> 1: continue
frg = int(ldExtractFromLine(ldline, 2));
if (frg>31) and (frg<48): continue
if ldExtractFromLine(ldline, 7) <> '0' : continue
if ldExtractFromLine(ldline, 9) <> '0' : continue
if ldExtractFromLine(ldline, 10) <> '1' : continue
if ldExtractFromLine(ldline, 11) <> '0' : continue
if ldExtractFromLine(ldline, 13) <> '0' : continue
fil = ldExtractFromLine(ldline ,15);
if len(fil)<5: continue # just to be foolproof...
"""
2010-03-20 also check if already boxed parts cover positions
by removing B\, B\t, or B\B from examined file reference
"""
if fil[0:3].upper() == "B\\T": # mjh
fil = fil[3:] # mjh
if fil[0:3].upper() == "B\\B": # mjh
fil = fil[3:] # mjh
if fil[0:2].upper() == "B\\": # mjh
fil = fil[2:] # mjh
if len(fil)<5 : continue
fil = fil[0:(len(fil)-4)] # mjh
fil = os.path.join(LDRAWPATH ,'Parts' ,'B' ,fil + '.nfo')
print "Searching for" ,fil
if not os.path.exists(fil) : continue
x1 = float(ldExtractFromLine(ldline ,3))
y1 = float(ldExtractFromLine(ldline ,4))
z1 = float(ldExtractFromLine(ldline ,5))
a1 = float(ldExtractFromLine(ldline ,6))
c1 = float(ldExtractFromLine(ldline ,8))
g1 = float(ldExtractFromLine(ldline ,12))
i1 = float(ldExtractFromLine(ldline ,14))
NFOCONTENT = []
try:
with open(fil ,"r") as f:
for line in f:
NFOCONTENT.append(line)
f.close()
except:
NFOCONTENT = []
print INVALIDACCESS_MSG % fil
StrListInfil = []
StrListInfil.extend(NFOCONTENT)
for ii in range(StrListInfil.__len__()):
ldline = StrListInfil[ii]
s = ldExtractFromLine(ldline, 1)
x2 = float(ldExtractFromLine(ldline, 2))
y2 = float(ldExtractFromLine(ldline, 3))
z2 = float(ldExtractFromLine(ldline, 4))
if s=='Top' or s=='Stud' : s = 'T '
if s=='Bottom' : s = 'B '
x3 = x1 + x2*a1 + z2*c1
y3 = y1 + y2
z3 = z1 + x2*g1 + z2*i1
s = s + FloatToLDraw(x3) + ' '
s = s + FloatToLDraw(y3) + ' '
s = s + FloatToLDraw(z3)
StrLstCover.append(s)
"""
END of cmdFittingsClick STEP 1
The model file in chklstInfile has been scanned for locations
meeting all the given criterias
For example:
This following line meets the criteria:
1 15 240 -48 160 1 0 0 0 1 0 0 0 1 3005.dat
The two lines from the file Parts\B\3005.nfo is used:
Stud 0 0 0
Bottom 0 24 0
The output stored in StrListCover is the following two lines:
T 240 -48 160
B 240 -24 160
"""
"""
cmdFittingsClick STEP 2: Replace all parts that can be fully boxed
Checkbox all parts that has all stud and bottom locations covered
according to StrListCover
"""
for i in range(CHKLST_INFILE.__len__()):
ldline = CHKLST_INFILE[i]
if ldLineType(ldline) <> 1 : continue;
frg = int(ldExtractFromLine(ldline, 2))
if (frg>31) and (frg<48) : continue
if ldExtractFromLine(ldline, 7) <> '0' : continue
if ldExtractFromLine(ldline, 9) <> '0' : continue
if ldExtractFromLine(ldline, 10) <> '1' : continue
if ldExtractFromLine(ldline, 11) <> '0' : continue
if ldExtractFromLine(ldline, 13) <> '0' : continue
fil = ldExtractFromLine(ldline, 15)
if len(fil)<5 : continue
fil = fil[0:(len(fil)-4)] # mjh
fil = os.path.join(LDRAWPATH ,'Parts' ,'B' ,fil + '.dat')
if not os.path.exists(fil): continue
fil = fil[0:(len(fil)-4)]
fil = fil + '.nfo';
if not os.path.exists(fil): continue
x1 = float(ldExtractFromLine(ldline, 3))
y1 = float(ldExtractFromLine(ldline, 4))
z1 = float(ldExtractFromLine(ldline, 5))
a1 = float(ldExtractFromLine(ldline, 6))
c1 = float(ldExtractFromLine(ldline, 8))
g1 = float(ldExtractFromLine(ldline, 12))
i1 = float(ldExtractFromLine(ldline, 14))
NFOCONTENT = []
try:
with open(fil ,"r") as f:
for line in f:
NFOCONTENT.append(line)
f.close()
except:
NFOCONTENT = []
print INVALIDACCESS_MSG % fil
StrListInfil = []
StrListInfil.extend(NFOCONTENT)
SkipThis = False
for ii in range(StrListInfil.__len__()):
ldline = StrListInfil[ii]
s = ldExtractFromLine(ldline, 1)
x2 = float(ldExtractFromLine(ldline, 2))
y2 = float(ldExtractFromLine(ldline, 3))
z2 = float(ldExtractFromLine(ldline, 4))
if s =='Top' : continue
if s =='Stud' : s = 'B ' # Scan for matching B
if s =='Bottom' : s = 'T ' # Scan for matching T
x3 = x1 + x2*a1 + z2*c1
y3 = y1 + y2
z3 = z1 + x2*g1 + z2*i1
s = s + FloatToLDraw(x3) + ' '
s = s + FloatToLDraw(y3) + ' '
s = s + FloatToLDraw(z3)
SkipThis == True
for iii in range(StrLstCover.__len__()):
if s==StrLstCover[iii] : SkipThis = False
if SkipThis : break
if SkipThis : continue
strPrefix = "B\\"
cmdReplace()
"""
END of cmdFittingsClick STEP 2
"""
"""
cmdFittingsClick STEP 3: Replace all parts that studs can be removed from
(STEPs 3 & 4 should be easily baked into STEP 2...)
"""
for i in range(CHKLST_INFILE.__len__()):
ldline = CHKLST_INFILE[i]
if ldLineType(ldline) <> 1: continue;
frg = int(ldExtractFromLine(ldline, 2));
if (frg>31) and (frg<48) : continue;
if ldExtractFromLine(ldline, 7) <> '0' : continue
if ldExtractFromLine(ldline, 9) <> '0' : continue
if ldExtractFromLine(ldline, 10) <> '1' : continue
if ldExtractFromLine(ldline, 11) <> '0' : continue
if ldExtractFromLine(ldline, 13) <> '0' : continue
fil = ldExtractFromLine(ldline, 15);
if len(fil)<5 : continue
fil = fil[0:(len(fil)-4)] # mjh
fil = os.path.join(LDRAWPATH ,'Parts' ,'B' ,fil + '.dat')
if not os.path.exists(fil) : continue
fil = fil[0:(len(fil)-4)] # mjh
fil = fil + '.nfo'
if not os.path.exists(fil) : continue
x1 = float(ldExtractFromLine(ldline, 3))
y1 = float(ldExtractFromLine(ldline, 4))
z1 = float(ldExtractFromLine(ldline, 5))
a1 = float(ldExtractFromLine(ldline, 6))
c1 = float(ldExtractFromLine(ldline, 8))
g1 = float(ldExtractFromLine(ldline, 12))
i1 = float(ldExtractFromLine(ldline, 14))
NFOCONTENT = []
try:
with open(fil ,"r") as f:
for line in f:
NFOCONTENT.append(line)
f.close()
except:
NFOCONTENT = []
print INVALIDACCESS_MSG % fil
StrListInfil = []
StrListInfil.extend(NFOCONTENT)
SkipThis = False
for ii in range (StrListInfil.__len__()) :
ldline = StrListInfil[ii]
s = ldExtractFromLine(ldline, 1)
x2 = float(ldExtractFromLine(ldline, 2))
y2 = float(ldExtractFromLine(ldline, 3))
z2 = float(ldExtractFromLine(ldline, 4))
if s =='Top' : continue
#if s == 'Stud': continue
if s =='Stud' : s = 'B ' # Scan for matching B
if s =='Bottom' : continue
#if s == 'Bottom': s = 'T ' # Scan for matching T
x3 = x1 + x2*a1 + z2*c1
y3 = y1 + y2
z3 = z1 + x2*g1 + z2*i1
s = s + FloatToLDraw(x3) + ' '
s = s + FloatToLDraw(y3) + ' '
s = s + FloatToLDraw(z3)
SkipThis = True;
for iii in range (StrLstCover.__len__()) :
if s==StrLstCover[iii] : SkipThis = False
if SkipThis : break
if SkipThis : continue
strPrefix = 'B\\T'
cmdReplace()
"""
END of cmdFittingsClick STEP 3
"""
"""
cmdFittingsClick STEP 4: Replace all parts that bottom details
can be removed from
(STEPs 3 & 4 should be easily baked into STEP 2...)
"""
for i in range (CHKLST_INFILE.__len__()) :
ldline = CHKLST_INFILE[i];
if ldLineType(ldline) <> 1 : continue;
frg = int(ldExtractFromLine(ldline, 2));
if (frg>31) and (frg<48) : continue;
if ldExtractFromLine(ldline, 7) <> '0' : continue;
if ldExtractFromLine(ldline, 9) <> '0' : continue;
if ldExtractFromLine(ldline, 10) <> '1' : continue;
if ldExtractFromLine(ldline, 11) <> '0' : continue;
if ldExtractFromLine(ldline, 13) <> '0' : continue;
fil = ldExtractFromLine(ldline, 15);
if len(fil)<5 : continue
fil = fil[0:(len(fil)-4)] # mjh
fil = os.path.join(LDRAWPATH ,'Parts' ,'B' ,fil + '.dat')
if not os.path.exists(fil) : continue
fil = fil[0:(len(fil)-4)] # mjh
fil = fil + '.nfo'
if not os.path.exists(fil) : continue
x1 = float(ldExtractFromLine(ldline, 3))
y1 = float(ldExtractFromLine(ldline, 4))
z1 = float(ldExtractFromLine(ldline, 5))
a1 = float(ldExtractFromLine(ldline, 6))
c1 = float(ldExtractFromLine(ldline, 8))
g1 = float(ldExtractFromLine(ldline, 12))
i1 = float(ldExtractFromLine(ldline, 14))
NFOCONTENT = []
try:
with open(fil ,"r") as f:
for line in f:
NFOCONTENT.append(line)
f.close()
except:
NFOCONTENT = []
print INVALIDACCESS_MSG % fil
StrListInfil = []
StrListInfil.extend(NFOCONTENT)
SkipThis = False
for ii in range (StrListInfil.__len__()) :
ldline = StrListInfil[ii];
s = ldExtractFromLine(ldline, 1)
x2 = float(ldExtractFromLine(ldline, 2))
y2 = float(ldExtractFromLine(ldline, 3))
z2 = float(ldExtractFromLine(ldline, 4))
if s=='Top' : continue
if s=='Stud' : continue
if s=='Stud' : s = 'B ' # Scan for matching B
#if s=='Bottom' : continue
if s=='Bottom' : s = 'T ' # Scan for matching T
x3 = x1 + x2*a1 + z2*c1
y3 = y1 + y2
z3 = z1 + x2*g1 + z2*i1
s = s + FloatToLDraw(x3) + ' '
s = s + FloatToLDraw(y3) + ' '
s = s + FloatToLDraw(z3)
SkipThis = True
for iii in range (StrLstCover.__len__()) :
if s==StrLstCover[iii] : SkipThis = False
if SkipThis : break
if SkipThis : continue
strPrefix = 'B\\B'
cmdReplace()
"""
END of cmdFittingsClick STEP 4
"""
print
print "Boxed %d parts" % REPLACEDTOTAL_COUNT
if REPLACEDTOTAL_COUNT>0 :
# 0 !LDOXER LEVEL info should also be automatically updated!
CHKLST_INFILE.append("0 // Boxed Total {0} parts by {1} v{2}\r\n".format(REPLACEDTOTAL_COUNT ,__appname__ ,__version__))
CHKLST_INFILE.append("0")
try:
dirname = os.path.dirname(MODELPATH)
basename = "boxed_" + os.path.basename(MODELPATH)
with open(os.path.join(dirname,basename) ,"wb") as f:
for line in CHKLST_INFILE:
f.write(line)
f.close()
except Exception, ex:
print ex.message
else:
print "Saved {0} in {1}".format(basename ,dirname)
[edit]
I updated the code with a few fixes.
RE: LDBoxer - Jarema - 2018-01-14
Sorry for late response. I do not have much time for this. I don't know what is wrong with Python code, so i roll up to Pascal code.
You can download from here http://jaremaczajkowski.pl/pub/forum/LDBoxer2017d_DelphiSource.zip.
I do not have idea why Tore Eriksson search files in %LDRAWPATH%\PARTS\B except S directory, but i stay as is. It is possible that some things were bad from the beginning.
After close application, you can look on activity log in file ldboxer_stdout.txt
RE: LDBoxer - Michael Horvath - 2018-01-14
(2018-01-14, 9:05)Jarema Wrote: Sorry for late response. I do not have much time for this. I don't know what is wrong with Python code, so i roll up to Pascal code.
You can download from here http://jaremaczajkowski.pl/pub/forum/LDBoxer2017d_DelphiSource.zip.
I do not have idea why Tore Eriksson search files in %LDRAWPATH%\PARTS\B except S directory, but i stay as is. It is possible that some things were bad from the beginning.
After close application, you can look on activity log in file ldboxer_stdout.txt
Which compiler is needed to build and run this version? Delphi is not free IIRC.
RE: LDBoxer - Jarema - 2018-01-14
(2018-01-14, 11:44)Michael Horvath Wrote: Which compiler is needed to build and run this version? Delphi is not free IIRC.
You can always start use FREE Trial version. Like i temporary do. By the way, write how the program works. Personally, i prefers other programming languages.
EDIT: You can download and use Lazarus from https://www.lazarus-ide.org/ as alternative too.
RE: LDBoxer - Tore Eriksson - 2018-01-15
(2018-01-14, 11:44)Michael Horvath Wrote: Which compiler is needed to build and run this version? Delphi is not free IIRC.
I think I used Delphi v7.0, and it was free since they want us to get hooked in an old free version and then upgrade to one that's not free. There were many problems with LDBoxer if my memory serves me right. The biggest was it didn't have support for long file names or whitespaces in paths or file names. The constant changes of the LDraw spec's made me give up the whole project.
And: LDBoxer - at least in my versions - does not support MPD or any SNOT application at all. I simply don't have that programming skills.
RE: LDBoxer - Michael Horvath - 2018-01-16
(2018-01-15, 22:15)Tore Eriksson Wrote: (2018-01-14, 11:44)Michael Horvath Wrote: Which compiler is needed to build and run this version? Delphi is not free IIRC.
I think I used Delphi v7.0, and it was free since they want us to get hooked in an old free version and then upgrade to one that's not free. There were many problems with LDBoxer if my memory serves me right. The biggest was it didn't have support for long file names or whitespaces in paths or file names. The constant changes of the LDraw spec's made me give up the whole project.
And: LDBoxer - at least in my versions - does not support MPD or any SNOT application at all. I simply don't have that programming skills.
It's sad that it doesn't handle MPD files properly. It's still better than nothing, though.
Do you think you could build a version that works on the command-line?
Or, could you take a look at @Jarema's and my direct translation into Python? I can get the script to run (Python scripts don't need to be compiled first, as long as you have Python installed), but there's something broken in it.
Thanks!
RE: LDBoxer - Tore Eriksson - 2018-01-16
(2018-01-16, 0:28)Michael Horvath Wrote: (2018-01-15, 22:15)Tore Eriksson Wrote: I think I used Delphi v7.0, and it was free since they want us to get hooked in an old free version and then upgrade to one that's not free. There were many problems with LDBoxer if my memory serves me right. The biggest was it didn't have support for long file names or whitespaces in paths or file names. The constant changes of the LDraw spec's made me give up the whole project.
And: LDBoxer - at least in my versions - does not support MPD or any SNOT application at all. I simply don't have that programming skills.
It's sad that it doesn't handle MPD files properly. It's still better than nothing, though.
Do you think you could build a version that works on the command-line?
Or, could you take a look at @Jarema's and my direct translation into Python? I can get the script to run (Python scripts don't need to be compiled first, as long as you have Python installed), but there's something broken in it.
Thanks!
Maybe I could learn to parse MPD's. But even so, that would create new, potentially impossible problems. What if the same sub-file is used multiple times in an MPD, and the same used part should be boxed in some occations but not all of them?
Normally, I make command line programs in C and GUI programs in Delphi. That would mean I have to translate the entire program to C.
I don't speak Python, and I no longer have the capacity to teach myself a new programming environment.
RE: LDBoxer - Michael Horvath - 2018-01-16
(2018-01-16, 19:22)Tore Eriksson Wrote: Maybe I could learn to parse MPD's. But even so, that would create new, potentially impossible problems. What if the same sub-file is used multiple times in an MPD, and the same used part should be boxed in some occations but not all of them?
I wouldn't worry about MPD support, then. The proper thing to do (which I've been doing) in this case is to inline all the submodels using MPDCenter.
(2018-01-16, 19:22)Tore Eriksson Wrote: Normally, I make command line programs in C and GUI programs in Delphi. That would mean I have to translate the entire program to C.
I don't speak Python, and I no longer have the capacity to teach myself a new programming environment.
Could you at least move the onscreen buttons and checkbox to the left side of the screen? Modern Windows have display DPI settings that can be changed, causing the buttons in LDBoxer to disappear.
http://www.dummies.com/computers/pcs/change-your-monitors-dots-per-inch-dpi-setting/
You can try for yourself.
RE: LDBoxer - Michael Horvath - 2018-01-25
(2017-03-18, 13:30)Jarema Wrote: I created repository for this utility here: https://github.com/Jeremy1980/LDBoxer
I think I managed to get the Python script working. See here:
https://github.com/Jeremy1980/LDBoxer/issues/5
RE: LDBoxer - Michael Horvath - 2018-01-26
(2018-01-25, 2:22)Michael Horvath Wrote: I think I managed to get the Python script working. See here:
https://github.com/Jeremy1980/LDBoxer/issues/5
I created a better optimized version that is also available at the above link. Normally it is very slow due to being a Python script. However, using PyPy instead of CPython results in a huge improvement in performance!
Not sure how much faster a Pascal, C#, etc. version of this script would be. I may try again in the future.
RE: LDBoxer - Michael Horvath - 2018-01-27
(2018-01-26, 9:52)Michael Horvath Wrote: (2018-01-25, 2:22)Michael Horvath Wrote: I think I managed to get the Python script working. See here:
https://github.com/Jeremy1980/LDBoxer/issues/5
I created a better optimized version that is also available at the above link. Normally it is very slow due to being a Python script. However, using PyPy instead of CPython results in a huge improvement in performance!
Not sure how much faster a Pascal, C#, etc. version of this script would be. I may try again in the future.
I updated the script so that trailing zeros are deleted from numbers. This should reduce output model size considerably.
https://github.com/Jeremy1980/LDBoxer/issues/7
RE: LDBoxer - Jarema - 2018-01-27
Check Private Message.
RE: LDBoxer - Michael Horvath - 2018-01-30
Jarema gave me commit access to GitHub, so the latest version can once again be downloaded directly from the repository.
https://github.com/Jeremy1980/LDBoxer
RE: LDBoxer - Michael Horvath - 2018-02-02
I was thinking that it wouldn't be too hard to process some SNOT parts as well. Basically, just apply the transformation matrix of Part A to Parts B to Z and then check for coincidence as per normal. Not sure how to code it though.
RE: LDBoxer - Tore Eriksson - 2018-02-24
(2018-01-10, 23:37)Michael Horvath Wrote: Code: '''
Created on 16 mar 2017
Updated on 10 jan 2018
@author: Jeremy Czajkowski
@author: Tore Eriksson <[email protected]>
@author: Michael Horvath My mail address need to be updated! The swipnet address has been dead for years.
@author: Tore Eriksson <[email protected]>
RE: LDBoxer - Michael Horvath - 2018-02-24
(2018-02-24, 11:07)Tore Eriksson Wrote: (2018-01-10, 23:37)Michael Horvath Wrote: Code: '''
Created on 16 mar 2017
Updated on 10 jan 2018
@author: Jeremy Czajkowski
@author: Tore Eriksson <[email protected]>
@author: Michael Horvath My mail address need to be updated! The swipnet address has been dead for years.
@author: Tore Eriksson <[email protected]>
Fixed. Thanks.
|