LDBoxer


LDBoxer
#1
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!
Reply
RE: LDBoxer
#2
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?
Reply
RE: LDBoxer
#3
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?
Reply
RE: LDBoxer
#4
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.
Lego isn't just a brand of plastic bricks. It's a lifestyle; and artistic medium.
Reply
RE: LDBoxer
#5
(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.
Reply
RE: LDBoxer
#6
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.
Lego isn't just a brand of plastic bricks. It's a lifestyle; and artistic medium.
Reply
RE: LDBoxer
#7
I created repository for this utility here: https://github.com/Jeremy1980/LDBoxer
Lego isn't just a brand of plastic bricks. It's a lifestyle; and artistic medium.
Reply
RE: LDBoxer
#8
(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/dc1sx16tw2...170409.zip


Mike
Reply
RE: LDBoxer
#9
(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/y56s7dj77v...d_half.zip

The program simply says "Boxed 0 parts" and then quits.

Could you take a look please?
Reply
RE: LDBoxer
#10
Roger that. I Take this in my free-time.
Lego isn't just a brand of plastic bricks. It's a lifestyle; and artistic medium.
Reply
RE: LDBoxer
#11
(2018-01-10, 7:41)Jarema Wrote: Roger that. I Take this in my free-time.

Thank you.
Reply
RE: LDBoxer
#12
(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.
Reply
RE: LDBoxer
#13
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/LDB...Source.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
Lego isn't just a brand of plastic bricks. It's a lifestyle; and artistic medium.
Reply
RE: LDBoxer
#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/LDB...Source.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.
Reply
RE: LDBoxer
#15
(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.
Lego isn't just a brand of plastic bricks. It's a lifestyle; and artistic medium.
Reply
RE: LDBoxer
#16
(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.
Reply
RE: LDBoxer
#17
(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!
Reply
RE: LDBoxer
#18
(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.
Reply
RE: LDBoxer
#19
(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/cha...i-setting/

You can try for yourself.
Reply
RE: LDBoxer
#20
(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
Reply
RE: LDBoxer
#21
(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.
Reply
RE: LDBoxer
#22
(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
Reply
RE: LDBoxer
#23
Check Private Message.
Lego isn't just a brand of plastic bricks. It's a lifestyle; and artistic medium.
Reply
RE: LDBoxer
#24
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
Reply
RE: LDBoxer
#25
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.
Reply
RE: LDBoxer
#26
(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]>
Reply
RE: LDBoxer
#27
(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.
Reply
« Next Oldest | Next Newest »



Forum Jump:


Users browsing this thread: 1 Guest(s)