OBJ Importer Plugin

On 20/03/2013 at 01:58, xxxxxxxx wrote:

i have multiple obj files in one folder and want to load them into the scene. i have a plugin script which reads the files and print them to the console but the didn't open. can anybody have a look.

import c4d
from c4d import gui
from c4d import documents
from c4d import utils, bitmaps, storage,plugins 
import collections, os,math

#get an ID from the plugincafe
PLUGIN_ID = 1000901

plugName = "NEckimporter"

def doSomething() :
    pass
    
class ReadFolder(c4d.plugins.CommandData) :
    dialog = None
    def Execute(self, doc) :
        path=c4d.storage.LoadDialog(c4d.FILESELECTTYPE_ANYTHING, "Please choose the folder", c4d.FILESELECT_DIRECTORY)
        dirList=os.listdir(path)

for fname in dirList:
            print fname
            c4d.documents.LoadFile(fname) # the prints works, but not the load

return True

def RestoreLayout(self, sec_ref) : 
        return True

On 20/03/2013 at 04:52, xxxxxxxx wrote:

you are not passing a valid path arguments to the LoadFile method. listdir returns a list
of the file names for the given folder path, not the file paths contained in in a folder path.

please use [KODE]mycode[/KODE] flags for your code (code written with c instead of k).

On 20/03/2013 at 05:42, xxxxxxxx wrote:

Yeah i figured it out, i have to take the whole file path. Its now working, but it opens each obj  in its own document. i want to merge it into the same document like the import function. is there a way without merging documents together? this is the only solution i find in the docs.

On 20/03/2013 at 06:37, xxxxxxxx wrote:

yeah it is obviously loading each file into seperate document, i thought this was intentional.
to merge the file with your current document either use c4d.documents.mergedocument or
c4d.documents.loaddocument. the first method just works like the command know from the
c4d file menu, while the second method does not do any loading, but returns a BaseDocument.
you would have then manually search and insert the data from the returned BaseDocuments

On 20/03/2013 at 07:22, xxxxxxxx wrote:

hi littledevil,
can you point me out how to use the merge documents? i couldn't figure it out, how to merge all into one.

On 20/03/2013 at 08:10, xxxxxxxx wrote:

Originally posted by xxxxxxxx

hi littledevil,
can you point me out how to use the merge documents? i couldn't figure it out, how to merge all into one.

not sure what is meant with that. just merge the documents in an iterative fashion or use the
loaddocument method and do it manually.

def Execute(self, doc) :
...
res = True
for path in pathlist:
	res = res and documents.MergeDocument(doc, path, c4d.SCENEFILTER_OBJECTS)

edit:

it might be necessary that you send a message to the hosting basedocument each time 
you merge a document with the hosting document before you merge the next document
(see basedocument.sendinfo). haven't done such mass merging yet. if it still fails to work 
for multiple documents simply use loaddocument and add the objects/ materials manually.

On 21/03/2013 at 08:32, xxxxxxxx wrote:

ok i tried the way to read the first doc ad merge it with the active (which is the last opened) with this code but nothing happened. no failure an no merging.
    def Execute(self, doc) :
        path=c4d.storage.LoadDialog(c4d.FILESELECTTYPE_ANYTHING, "Please choose the folder", c4d.FILESELECT_DIRECTORY)
        dirList=os.listdir(path)

for fname in dirList:
            openName = os.path.join(path, fname)
            print openName
            r = c4d.documents.LoadFile(openName)

firstDoc = c4d.documents.GetFirstDocument()
        activeDoc = c4d.documents.GetActiveDocument()
        print firstDoc
        print activeDoc
        c4d.documents.MergeDocument(activeDoc, firstDoc,  c4d.SCENEFILTER_OBJECTS)# | c4d.SCENEFILTER_MATERIALS)

On 21/03/2013 at 09:36, xxxxxxxx wrote:

use codetags and read the documenation. MergeDocument accepts a BaseDocument for the
hosting document variable and a string path or MemoryFileStruct for the document to merge.
you pass two BaseDocuments.

also your approach will open multiple docments within c4d, which is apparently not your goal.
the reason why you are not getting any result is, that you do not read/print the MergeDocument
result. It will be always False, as your second parameter is not in the expected format.

On 21/03/2013 at 10:39, xxxxxxxx wrote:

Give this a try.
It should load all of the .c4d scene files, .obj files, etc. in the selected folder

import c4d  
from c4d import gui  
from c4d import documents  
from c4d import utils, bitmaps, storage,plugins   
import collections, os, math  
  
#get an ID from the plugincafe  
PLUGIN_ID = 1000901  
    
class ReadFolder(c4d.plugins.CommandData) :  
  
  def Execute(self, doc) :  
    
      path=c4d.storage.LoadDialog(c4d.FILESELECTTYPE_SCENES, "Please choose the folder", c4d.FILESELECT_DIRECTORY)  
      dirList=os.listdir(path)  
  
      for fname in dirList:  
          openName = os.path.join(path, fname)  
          #print openName   
          c4d.documents.MergeDocument(doc, openName, 1)  
          c4d.EventAdd()  
  
      return True   
        
if __name__ == "__main__":      
    
  help = "The text shown at the bottom of C4D when the plugin is selected in the menu"  
    
  plugins.RegisterCommandPlugin(PLUGIN_ID, "Read Folder", 0, None, help, ReadFolder())

-ScottA

On 22/03/2013 at 01:24, xxxxxxxx wrote:

Hey ScottA,
this code works like a charm :) thanks.