Cinema 4D dies when plugindialog is linked in gui
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 24/06/2011 at 15:28, xxxxxxxx wrote:
Hi,
when I link my plugindialog into the gui and set it as default layout and then restart Cinema, it doesn't show up anymore.
Deleting the "prefs" folder fixes this problem, because the Dialog is no more linked in the gui.I assume this is because of CommandData.RestoreLayout ?
I just can't figure it out.Here's the source:
# still quick and dirty import c4d from c4d import Vector from c4d.documents import GetFirstDocument, GetActiveDocument, SetActiveDocument from c4d.gui import GeUserArea, GeDialog from c4d.plugins import CommandData, RegisterCommandPlugin def GetDocuments() : def foo() : doc = GetFirstDocument() while doc: yield doc doc = doc.GetNext() return tuple(foo()) class DocViewer_View(GeUserArea) : rowheight = 18 indentation = 5 color_darker = Vector(.29) color_lighter = Vector(.31) color_selected = Vector(.2) color_text = Vector(.64705) color_text_marked = Vector(1., .66, .024) def __init__(self, parent = None) : if parent: self.InitParent(parent) def InitParent(self, parent) : if not isinstance(parent, GeDialog) : return False self.parent = parent return True def DrawMsg(self, x1, y1, x2, y2, msg) : documents = GetDocuments() active = GetActiveDocument() self.DrawRectangle(x1, y1, x2, y2) self.DrawBorder(c4d.BORDER_THIN_IN, x1, y1, x2, y2) for i, doc in enumerate(documents) : if i % 2 == 0: self.DrawSetPen(self.color_darker) else: self.DrawSetPen(self.color_lighter) if doc == active: self.DrawSetTextCol(self.color_text_marked, 999) self.DrawSetPen(self.color_selected) else: self.DrawSetTextCol(self.color_text, 999) Rect = { "x1": x1, "x2": x2, "y1": i * self.rowheight, "y2": (i + 1) * self.rowheight, } self.DrawRectangle(**Rect) name = doc.GetDocumentName() if not name: name = "Untitled " + str(i).rjust(3, "0") self.DrawText(name, x1 + self.indentation, Rect["y1"] + 1) def InputEvent(self, msg) : device = msg[c4d.BFM_INPUT_DEVICE] if device == c4d.BFM_INPUT_MOUSE: documents = GetDocuments() global2local = self.Global2Local() mouseY = msg[c4d.BFM_INPUT_Y] + global2local["y"] row = int(mouseY / self.rowheight) if row >= len(documents) : pass else: SetActiveDocument(documents[row]) c4d.EventAdd() self.Redraw() if self.parent: self.parent.Command(self.GetId(), msg) return True def GetMinSize(self) : return 100, self.rowheight * 2 class DocViewer_Dialog(GeDialog) : ua = DocViewer_View() ua_id = 99999 def __init__(self) : pass def CreateLayout(self) : self.ua.InitParent(self) self.AddUserArea(self.ua_id, c4d.BFH_SCALEFIT | c4d.BFV_SCALEFIT) self.AttachUserArea(self.ua, self.ua_id) return True class DocViewer_Command(CommandData) : dlg = None COMMAND_ID = 10009121 # not registered !! COMMAND_ICON = None def Execute(self, doc) : if not self.dlg: self.dlg = DocViewer_Dialog() self.dlg.Open(c4d.DLG_TYPE_ASYNC) return True def RestoreLayout(self, subid) : if not self.dlg: self.dlg = DocViewer_Dialog() return self.dlg.Restore(self.COMMAND_ID, subid) @classmethod def Register(cls) : data = { "id": cls.COMMAND_ID, "icon": cls.COMMAND_ICON, "str": "Documents Viewer", "help": "Shows up a dialog with all open Documents. You can change the active Document by clicking into the Dialog.", "info": c4d.PLUGINFLAG_COMMAND_HOTKEY, "dat": cls(), } RegisterCommandPlugin(**data) if __name__ == "__main__": DocViewer_Command.Register()
I've never been that desperate..
Thanks,
Niklas -
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 24/06/2011 at 17:24, xxxxxxxx wrote:
In your code you forgot to pass the ID to GeDialog.Open (2nd arg). If you open an asynchronous dialog you have to pass the pluginid.
Edit:
Btw,you dont need to pass them in synchronous dialogs. -
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 25/06/2011 at 00:22, xxxxxxxx wrote:
Thanks Sebastian ! That did it ! :hugging:
Perfect !Originally posted by xxxxxxxx
Dialogs are very error-prone if they are not handled correctly.
Yes, they are !
But you can do cool stuff with them.