def Main(): try: data_name = "Rect2DogBone" curves = rs.GetObjects("Rectangle curve", rs.filter.curve, True, True) diam = rs.GetInteger( "DogBone circle diameter", 16 if not rs.GetDocumentData(data_name, "diam_external") else float(rs.GetDocumentData(data_name, "diam_external"))) diam_barrenos = rs.GetInteger( "Circle at centroid (0=None -1=Point n=Diameter)", 0 if not rs.GetDocumentData(data_name, "diam_barrenos") else float( rs.GetDocumentData(data_name, "diam_barrenos"))) tol = float( rs.GetReal( "External offset", 0 if not rs.GetDocumentData(data_name, "tolerance") else float( rs.GetDocumentData(data_name, "tolerance")))) if curves and diam: rs.EnableRedraw(False) dogbone(curves, diam, diam_barrenos, tol) rs.SetDocumentData(data_name, "diam_external", str(diam)) rs.SetDocumentData(data_name, "diam_barrenos", str(diam_barrenos)) rs.SetDocumentData(data_name, "tolerance", str(tol)) rs.EnableRedraw(True) print("%s DogBones created" % len(curves)) except Exception as e: print("Error: %s" % e)
def test_IsDocumentUserTextIgnoresDocumentData(self): s,e,v = sec_ent_val() rs.SetDocumentData(s,e,v) s,e,v = sec_ent_val() rs.SetDocumentData(s,e,v) self.assertEqual(0, rs.DocumentUserTextCount()) self.assertTrue(rs.IsDocumentUserText() == False)
def set_document_data_with_section(): """Assume that a section is like a dictionary. Set: dict1 = {'key1a': 'value1a', 'key1b', 'value1b'} dict2 = {'key2a': 'value2a', 'key2b', 'value2b'} """ rs.SetDocumentData('dict1', 'key1a', 'value1a') rs.SetDocumentData('dict1', 'key1b', 'value1b') rs.SetDocumentData('dict2', 'key2a', 'value2a') rs.SetDocumentData('dict2', 'key2b', 'value2b')
def test_DocumentDataCountIgnoresUserText(self): _,k,v = sec_ent_val() rs.SetDocumentUserText(k,v) self.assertEqual(0, rs.DocumentDataCount()) s,e,v = sec_ent_val() rs.SetDocumentData(s,e,v) s,e,v = sec_ent_val() rs.SetDocumentData(s,e,v) self.assertEqual(2, rs.DocumentDataCount())
def storeDefaultValues(convert_for_biesse, export_clamex_txt, open_after_export): convert_for_biesse = rs.SetDocumentData("CheckAndExport", "convert_for_biesse", str(convert_for_biesse)) export_clamex_txt = rs.SetDocumentData("CheckAndExport", "export_clamex_txt", str(export_clamex_txt)) open_after_export = rs.SetDocumentData("CheckAndExport", "open_after_export", str(open_after_export))
def __undo_usertext(sender, e): """custom undo event - may be removed if bug in Rhino is fixed""" actuel = (rs.GetDocumentData("ScaleModel", "scale"), rs.GetDocumentData("ScaleModel", "state")) e.Document.AddCustomUndoEvent("Undo ScaleModel", __undo_usertext, actuel) old = e.Tag print(old) print("returning to %s scale" % (old[1])) rs.SetDocumentData("ScaleModel", "scale", old[0]) rs.SetDocumentData("ScaleModel", "state", old[1]) rs.ZoomExtents()
def test_DeleteDocumentData_not_delete_DocumentUserText(self): s, e, v = sec_ent_val() rs.SetDocumentData(s, e, v) _, k, v = sec_ent_val() rs.SetDocumentUserText(k, v) rs.DeleteDocumentData() self.assertEqual(v, rs.GetDocumentUserText(k))
def setFloorLevels(numFloors): """ sets the floor levels in document data input: int: the number of floors returns: None """ levelName = [] levels = [] for i in range(0, numFloors): levelName.append("L" + str(i + 1)) levelName.append("Roof") #if existing data, get for i in range(0, numFloors): if (rs.GetDocumentData("Levels", levelName[i]) is not None): levels.append(rs.GetDocumentData("Levels", levelName[i])) else: levels.append(None) if (rs.GetDocumentData("Levels", levelName[-1]) is not None): levels.append(rs.GetDocumentData("Levels", levelName[-1])) else: levels.append(None) #rs.DeleteDocumentData("Levels") newLevels = [] newLevels = rs.PropertyListBox(levelName, levels, "LEVELS", "Update the Levels below") if newLevels is None: return for i in range(0, numFloors + 1): rs.SetDocumentData("Levels", levelName[i], str(newLevels[i])) return None
def LoadLevelsToRhinoDoc(databaseFile): print "Loading levels to rhino doc" bldgNum = 0 data = GetProjectLevelData(databaseFile, bldgNum) print data rs.SetDocumentData('PCPA', 'Levels', str(data)) return 1
def _add_frames_layer(): layer_name = f.Frame.layer_name dark_gray = Color.FromArgb(105, 105, 105) rs.AddLayer(layer_name, dark_gray) layer_name_list_name = l.Layer.layer_name_list_name layer_name = f.Frame.layer_name layer_value = ll.Llist.dummy_value rs.SetDocumentData(layer_name_list_name, layer_name, layer_value)
def test_GetDocumentUserTextWithNoArgsIgnoresDocumentData(self): s,k,v = sec_ent_val() rs.SetDocumentData(s,k,v) rs.SetDocumentUserText(k,v) _,k,v = sec_ent_val() rs.SetDocumentUserText(k,v) self.assertTrue(not any("\\" in k for k in rs.GetDocumentUserText())) self.assertEqual(2, rs.GetDocumentUserText().Count)
def OnApplyPressed(self, sender, e): proj_Folder = self.drpDwnProjNum.SelectedValue #proj_Name = self.drpDwnProjNum.SelectedValue.split("_")[1] #proj_Number = self.drpDwnProjNum.SelectedValue.split("_")[0] rs.SetDocumentData('PCPA', 'Project_Folder', self.drpDwnProjNum.SelectedValue) #rs.SetDocumentData('PCPA', 'Project_Number', proj_Number) #rs.SetDocumentData('PCPA', 'Project_Name', proj_Name) #rs.SetDocumentData('PCPA', 'Project_City', self.tBoxProjCity.Text) self.Close()
def setNumFloors(): try: curNum = int(rs.GetDocumentData("NumLevels", "NumLevels")) except: curNum = 1 a = rs.GetInteger("Number of Levels in the building", minimum=1, number=curNum) rs.SetDocumentData("NumLevels", "NumLevels", str(a)) return None
def command_line_menu(interface): """Create a Rhino-style command line menu. Parameters: interface (dict) : A (nested) dictionary with interface options. The structure of the dictionary is as follows: interface['options'] := [...] interface['message'] := '...' interface['default'] := '...' interface['show'] := '...' interface['ID'] := '...' Return: str : The selected option. None : If the command is interrupted, for example by pressing ``ESC`` Examples: .. code-block:: python # ... """ if rs.GetDocumentData(interface["ID"], interface["ID"]): interface["default"] = rs.GetDocumentData(interface["ID"], interface["ID"]) new_options = [] sub_menus = {} for option in interface["options"]: if isinstance(option, basestring): new_options.append(option) else: new_options.append(option["show"]) sub_menus[option["show"]] = option result = rs.GetString(interface["message"], interface["default"], new_options) interface["default"] = result rs.SetDocumentData(interface["ID"], interface["ID"], result) if result in sub_menus: result = command_line_menu(sub_menus[result]) return result
def main(): items = [ "Project Name", "Project Number", "Project Location", "Plot Ratio", "Min Green Coverage", "Max Site Coverage", "CAD coordinate (X,Y,Z)" ] values = [] if rs.GetDocumentData("Project Info", items[0]) is not None: for i in range(0, len(items)): values.append(rs.GetDocumentData("Project Info", items[i])) else: values = [None, None] values = rs.PropertyListBox(items, values, "Project Info", "Project Info") #if rs.ObjectsByLayer("SITE::BNDY") is not None: # siteArea = rs.Area(rs.ObjectsByLayer("SITE::BNDY")) #else: # siteArea = "No Site Boundary Layer" for i in range(0, len(items)): rs.SetDocumentData("Project Info", items[i], values[i]) rs.Command("_Show ")
def rescale(): # get current state and scale from DocumentData, if present or from user, if not print("Current Scale: 1:", rs.GetDocumentData("ScaleModel", "scale")) print("Current State: ", rs.GetDocumentData("ScaleModel", "state")) if rs.GetDocumentData("ScaleModel", "scale") and rs.GetDocumentData( "ScaleModel", "state"): scale = float(rs.GetDocumentData("ScaleModel", "scale")) oldechelle = scale state = rs.GetDocumentData("ScaleModel", "state") oldetat = state else: state = "" state = rs.ListBox(items=("Full-Scale", "Model Scale"), message="Currently at what scale ?", title="Scale Model", default=state) if state is None: # cancelled return oldetat = state if state == "Model Scale": scale = 250. scale = rs.GetReal("Current Scale 1:", scale, 0) oldechelle = scale if scale is None: # cancelled return else: if state == "Full-Scale": scale = 1. previous_params = (str(scale), state) # get desired state and scale state = rs.ListBox(("Full-Scale", "Model Scale"), "Currently %s. Choose new state" % (state), "Rescale", state) if state == None: # cancelled return if state == "Model Scale": if not scale: scale = 250. scale = rs.GetReal("New Scale 1:", scale, 0) if scale == None: return rs.SetDocumentData("ScaleModel", "scale", str(scale)) rs.SetDocumentData("ScaleModel", "state", state) # scale geometry and dimensions dimstyles = rs.DimStyleNames() rs.EnableRedraw(False) if not oldetat == state: if state == "Full-Scale": rs.ScaleObjects(rs.AllObjects(), [0, 0, 0], [(scale), (scale), (scale)]) for dimstyle in dimstyles: rs.Command('_-ScaleDimstyle "' + dimstyle + '" ' + str(scale)) else: rs.ScaleObjects(rs.AllObjects(), [0, 0, 0], [(1 / scale), (1 / scale), (1 / scale)]) for dimstyle in dimstyles: rs.Command('_-ScaleDimstyle "' + dimstyle + '" ' + str(1 / scale)) else: if state == "Model Scale": rs.ScaleObjects(rs.AllObjects(), [0, 0, 0], \ [(oldechelle / scale), (oldechelle / scale), (oldechelle / scale)]) for dimstyle in dimstyles: rs.Command('_-ScaleDimstyle "' + dimstyle + '" ' + str(oldechelle / scale)) sc.doc.AddCustomUndoEvent("Undo ScaleModel", __undo_usertext, previous_params) print("New Scale: 1:", rs.GetDocumentData("ScaleModel", "scale")) print("New State: ", rs.GetDocumentData("ScaleModel", "state")) rs.EnableRedraw(True) rs.ZoomExtents(all=True)
def AddTitleBlock(size): filelocations = config.GetDict() rs.EnableRedraw(False) if size == 11: offset = .354 row1 = offset row2 = row1 * 2 row3 = row1 * 3 row4 = row1 * 4 leftEdge = offset middle = 17 / 2 rightEdge = 17 - offset pt1 = [leftEdge, row4] pt2 = [rightEdge, 11 - row1] txtBase1 = [middle, row2] txtBase2 = [leftEdge, row2] txtBase3 = [rightEdge, row2] txtBase4 = [leftEdge, row1] txtBase5 = [rightEdge, row1] lineSt = [leftEdge, row3] lineEnd = [rightEdge, row3] txtSizeL = .125 txtSizeM = .094 logoPlane = [13.834, .247, 0] logoWidth = 2.823 logoHeight = .116 elif size == 8: offset = .229 row1 = offset row2 = row1 * 2 row3 = row1 * 3 row4 = row1 * 4 leftEdge = offset middle = 11 / 2 rightEdge = 11 - offset pt1 = [leftEdge, row4] pt2 = [rightEdge, 8.5 - row1] txtBase1 = [middle, row2] txtBase2 = [leftEdge, row2] txtBase3 = [rightEdge, row2] txtBase4 = [leftEdge, row1] txtBase5 = [rightEdge, row1] lineSt = [leftEdge, row3] lineEnd = [rightEdge, row3] txtSizeL = .125 txtSizeM = .063 logoPlane = [8.347, .157, 0] logoWidth = 2.434 logoHeight = .100 elif size == 18: offset = .5 row1 = offset row2 = row1 * 2 row3 = row1 * 3 row4 = row1 * 4 leftEdge = offset middle = 24 / 2 rightEdge = 24 - offset pt1 = [leftEdge, row4] pt2 = [rightEdge, 18 - row1] txtBase1 = [middle, row2] txtBase2 = [leftEdge, row2] txtBase3 = [rightEdge, row2] txtBase4 = [leftEdge, row1] txtBase5 = [rightEdge, row1] lineSt = [leftEdge, row3] lineEnd = [rightEdge, row3] txtSizeL = .250 txtSizeM = .125 logoPlane = [19.627, .367, 0] logoWidth = 3.885 logoHeight = .160 layout = sc.doc.Views.GetPageViews()[-1] if layout is None: return sc.doc.Views.ActiveView = layout if rs.GetDocumentData(section="PCPA", entry="Project_Name") is None: rs.SetDocumentData(section="PCPA", entry="Project_Name", value="PROJECT TITLE") projectTitle = '%<DocumentText("PCPA\Project_Name")>%' if rs.GetDocumentData(section="PCPA", entry="Client_Name") is None: rs.SetDocumentData(section="PCPA", entry="Client_Name", value="Client Name") clientName = '%<DocumentText("PCPA\Client_Name")>%' #Add text textList = [] textList.append(rs.AddText("Title", txtBase1, txtSizeL, justification=2)) textList.append( rs.AddText(projectTitle, txtBase2, txtSizeL, justification=1)) textList.append( rs.AddText('%<Date("MMMM d, yyyy")>%', txtBase3, txtSizeM, justification=4)) textList.append(rs.AddText(clientName, txtBase4, txtSizeM, justification=1)) #ADD Copyright copyright = 'COPYRIGHT ' + u"\u00a9" + ' %<Date("yyyy")>%' copyrightText = rs.AddText(copyright, txtBase5, txtSizeM, justification=4) #ADD Pelli Clarke Pelli pcp = 'Pelli Clarke Pelli' pcpText = rs.AddText(pcp, txtBase5, txtSizeM, justification=4) if rs.IsDimStyle('PCPA_10'): dimstyleID = sc.doc.DimStyles.FindName('PCPA_14') ############## #Just trying to change the dim style here #pcpRhobj = rs.coercerhinoobject(pcpText) #test = pcpRhobj.Attributes #pcpRhobj.CommitChanges() ############## #ADD Architects architects = 'Architects' architectsText = rs.AddText(architects, txtBase5, txtSizeM, justification=4) #Horizontal line line = rs.AddLine(lineSt, lineEnd) #Add detail detail = rs.AddDetail(layout.ActiveViewportID, pt1, pt2, "PCPA " + str(layout.PageName), 7) #Change layers AddLayerByNumber try: rs.ObjectLayer(line, layers.GetLayerNameByNumber(8204)) except: pass try: rs.ObjectLayer(detail, layers.GetLayerNameByNumber(8106)) except: pass try: for eachText in textList: rs.ObjectLayer(eachText, layers.GetLayerNameByNumber(8105)) except: pass try: rs.ObjectLayer(copyrightText, layers.GetLayerNameByNumber(8211)) except: pass try: rs.ObjectLayer(pcpText, layers.GetLayerNameByNumber(8210)) except: pass try: rs.ObjectLayer(architectsText, layers.GetLayerNameByNumber(8211)) except: pass rs.EnableRedraw(True)
def test_SetDocumentDataReturnsNoneForNew(self): section, entry, value = sec_ent_val() self.assertTrue(rs.SetDocumentData(section, entry, value) == None)
def Main(): input_curves = rs.GetObjects("Curves", rs.filter.curve, True, True) input_points = rs.GetObjects("Points for dogboone placement", rs.filter.point) if not input_curves or not input_points: return #Reads, asks and writes settings to document data_name = "dogbone2" values = rs.GetDocumentData(data_name, "settings") values = json.loads(values)["data"] if values else [ "35.0", "15.0", "9.525", "1" ] settings = ["Length:", "With:", "Diameter:", "Tolerance Offset:"] length, width, diam, aperture = [ float(i.replace(" ", "")) for i in rs.PropertyListBox( settings, values, "DogBone by dfmd", "Settings:") ] rs.SetDocumentData(data_name, "settings", json.dumps({"data": [length, width, diam, aperture]})) sorted_points = [] clean_curves = [] rs.EnableRedraw(False) for curve in input_curves: point_list = [] for point in input_points: if rs.PointInPlanarClosedCurve(point, curve, rs.CurvePlane(curve)) == 2: point_list.append(point) if point_list: sorted_points.append(rs.SortPointList(point_list)) #Clean curve # circle = rs.AddCircle(rs.CurveAreaCentroid(curve)[0],10000) # planar_surface = rs.AddPlanarSrf(circle) # projected_curve = rs.ProjectCurveToSurface(curve,planar_surface,(0,0,-1)) # clean_curves.append(projected_curve) # rs.DeleteObjects([circle,planar_surface,curve]) clean_curves.append(curve) #main_curve = rs.GetCurveObject("Selecciona curva",True)[0] #main_points = rs.SortPointList(rs.GetObjects("Selecciona puntos de referencia",rs.filter.point)) #input_curves = rebuild_curves(input_curves) for main_curve in clean_curves: main_points = sorted_points[clean_curves.index(main_curve)] bone_curves = [ create_bone(point, main_curve, length, width, diam / 2, aperture) for point in main_points ] #new_main_curve = rs.CopyObject(rs.ConvertCurveToPolyline(main_curve,False,False,True)) new_main_curve = rs.CopyObject(main_curve) completed = True for bone_curve in bone_curves: buffer_curve = rs.CurveBooleanDifference(new_main_curve, bone_curve) if len(buffer_curve) > 1: rs.DeleteObjects(buffer_curve) rs.DeleteObject(new_main_curve) completed = False break rs.DeleteObject(new_main_curve) new_main_curve = buffer_curve if not completed: super_curve = rs.CurveBooleanUnion(bone_curves) rare_curves = rs.CurveBooleanDifference(main_curve, super_curve) if len(rare_curves) > 1: areas = [rs.CurveArea(i) for i in rare_curves] sorted_curves = [ x for (y, x) in sorted(zip(areas, rare_curves)) ] rs.DeleteObjects(sorted_curves[:-1]) rs.DeleteObject(super_curve) rs.DeleteObjects(bone_curves + [main_curve])
def test_GetDocumentDataSectionNameReturnsEntryNames(self): s,e1,v = sec_ent_val() rs.SetDocumentData(s, e1, v) _,e2,v = sec_ent_val() rs.SetDocumentData(s, e2, v) self.assertEqual([e1,e2], rs.GetDocumentData(s))
def test_GetDocumentData_Typical(self): s,e,v = sec_ent_val() rs.SetDocumentData(s,e,v) self.assertEqual(v, rs.GetDocumentData(s,e))
def test_GetDocumentDataNoArgsReturnsSectionNames(self): s,e,v = sec_ent_val() rs.SetDocumentData(s, e, v) _,e,v = sec_ent_val() rs.SetDocumentData(s, e, v) self.assertEqual([s], rs.GetDocumentData())
def test_GetDocumentDataReturnsNoneForBadSectionOrEntry(self): s, e, v = sec_ent_val() self.assertTrue(rs.GetDocumentData(s) == None) rs.SetDocumentData(s, e, v) self.assertTrue(rs.GetDocumentData(s, uniquestr()) == None)
def _set_entries(): rs.SetDocumentData(dict_name_1, key_1a, value_1a) rs.SetDocumentData(dict_name_1, key_1b, value_1b) rs.SetDocumentData(dict_name_2, key_2a, value_2a) rs.SetDocumentData(dict_name_2, key_2b, value_2b)
def storeDefaultValues( section, dict): for key in dict: value = dict[key] rs.SetDocumentData(section, key, str(value))
def OnFileCloseClick(self, sender, e): self.grid.DataStore = [] self.comboBuildingNum.DataStore = [] self.databaseFile = None self.UpdateFileLabel() rs.SetDocumentData('PCPA', 'Project_Database', "")
def Main(): if not LANG: return if not rs.IsLayer(OFFSET_LAYER): rs.AddLayer(OFFSET_LAYER) else: rs.DeleteObjects(rs.ObjectsByLayer(OFFSET_LAYER)) if not rs.IsLayer(TRASH_LAYER): rs.AddLayer(TRASH_LAYER) else: rs.DeleteObjects(rs.ObjectsByLayer(TRASH_LAYER)) original_layer = rs.CurrentLayer() machining_settings = False general_settings = False user_data = False # if rs.IsAlias(alias_name): # if rs.AliasMacro(alias_name) != "-_RunPythonScript (\"%s\")" % os.path.realpath(__file__): # if rs.MessageBox("Rhino tiene registrado esta ubicacion en el comando de %s:\n\n%s\n\nDeseas cambiarla por esta?\n\n%s\n" % (alias_name,rs.AliasMacro(alias_name),os.path.realpath(__file__)) , 4 | 32) == 6: # rs.DeleteAlias(alias_name) # rs.AddAlias(alias_name,"-_RunPythonScript (\"%s\")" % os.path.realpath(__file__)) # else: # pass # else: # if rs.MessageBox("Vincular el comando \"%s\" a este archivo?\n\n%s\n\nPodras ejecutar directamente el plugin escribiendo \"%s\" en la consola." % (alias_name,os.path.realpath(__file__),alias_name) , 4 | 32) == 6: # rs.AddAlias(alias_name,"-_RunPythonScript (\"%s\")" % os.path.realpath(__file__)) # else: # pass try: machining_settings = eval(rs.GetDocumentData(REGISTRY_SECTION,"machining_settings")) except: pass try: general_settings = eval(rs.GetDocumentData(REGISTRY_SECTION,"general_settings")) except: pass try: f = open(SETTINGS_FILE,"r") r = f.read() f.close() persistant = eval(r) if machining_settings != False: machining_settings.update(persistant) else: machining_settings = persistant except: pass try: user_data = eval(rs.GetDocumentData(REGISTRY_SECTION,"user_data")) if not user_data["save_path"]: user_data["save_path"] = rs.DocumentPath().replace(".3dm","_gcode.txt") if rs.DocumentPath() else False except: pass if user_data and user_data["selected_preset"] not in machining_settings: user_data["selected_preset"] = False print TXT["init"] ui = SettingsControl(general_settings,machining_settings,user_data) Rhino.UI.Dialogs.ShowSemiModal(ui.form) temporal = {} persistant = {} for name in ui.machining_settings: if ui.machining_settings[name]["persistant"]: temporal[name] = ui.machining_settings[name] else: persistant[name] = ui.machining_settings[name] f = open(SETTINGS_FILE,"w") f.write(str(persistant)) f.close() rs.SetDocumentData(REGISTRY_SECTION,"machining_settings",str(temporal)) rs.SetDocumentData(REGISTRY_SECTION,"general_settings",str(ui.general_settings)) rs.SetDocumentData(REGISTRY_SECTION,"user_data",str(ui.user_data)) # print "to registry...." # print "machining_settings",str(ui.machining_settings) # print "general_settings",str(ui.general_settings) # print "user_data",str(ui.user_data) # print "temp",str([i for i in temporal]) # print "persistant",str([i for i in persistant]) ui.code_thread = False rs.CurrentLayer(original_layer) rs.DeleteObjects(rs.ObjectsByLayer(OFFSET_LAYER)) rs.DeleteObjects(rs.ObjectsByLayer(TRASH_LAYER)) rs.DeleteLayer(OFFSET_LAYER) rs.DeleteLayer(TRASH_LAYER) print TXT["bye"]
def test_DeleteDocumentDataFailsOnEntryWithNoneSection(self): s, e, v = sec_ent_val() rs.SetDocumentData(s, e, v) self.assertRaises(TypeError, rs.DeleteDocumentData, None, e)
import rhinoscriptsyntax as rs data_name = "OffsetAndClose" curve = rs.GetObject("Select curve", rs.filter.curve, True, True) dir = rs.GetPoint("Offset direction") dist = rs.GetReal( "Offset distance", 5 if not rs.GetDocumentData(data_name, "dist") else float( rs.GetDocumentData(data_name, "dist"))) def offset(): curves = [curve] offset_curve = rs.OffsetCurve(curve, dir, dist) curves.append(offset_curve) curves.append( rs.AddLine(rs.CurveEndPoint(offset_curve), rs.CurveEndPoint(curve))) curves.append( rs.AddLine(rs.CurveStartPoint(offset_curve), rs.CurveStartPoint(curve))) rs.JoinCurves(curves, True) print "Offset created." if curve and dir and dist: try: offset() rs.SetDocumentData(data_name, "dist", str(dist)) except Exception as e: print('Error: %s' % e)
def OnFileSaveClick(self, sender, e): data = self.grid.DataStore reversed(data) rs.SetDocumentData('PCPA', 'Levels', str(data)) self.Close()