def prepare_rotor(self, model): templ = model.magnettype() if templ == 'mshfile': import femagtools.gmsh g = femagtools.gmsh.Gmsh(model.magnet['mshfile']['name']) r = g.get_section_radius() phi = g.get_section_angles() p = round(math.pi / (phi[1] - phi[0])) model.set_value('poles', p) model.set_value('inner_diam', 2 * r[0]) ag = (model.get('bore_diam') - 2 * r[1]) / 2 model.set_value('airgap', ag) model.magnet['rotor_msh'] = dict( name=model.magnet['mshfile']['name']) for sr in g.get_subregions(): model.magnet[sr] = g.get_location(sr) for k in ('yoke', 'air'): model.magnet[k] = model.magnet['mshfile'].get(k, []) model.magnet['mag'] = dict( sreg=model.magnet['mshfile'].get('mag', []), axis=[ g.get_axis_angle(s) for s in model.magnet['mshfile'].get('mag', []) ]) del model.magnet['mshfile'] return if templ != 'dxffile': return params = {} params['split'] = model.magnet[templ].get('split', False) params['show_plots'] = model.magnet[templ].get('plot', False) params['write_fsl'] = True params['airgap'] = -1.0 pos = 'out' if model.external_rotor else 'in' params['part'] = ('rotor', pos) logger.info("Conv rotor from %s", templ + '.dxf') conv = convert(model.magnet[templ]['name'], **params) model.set_value('poles', int(conv.get('num_poles'))) self.set_diameter_parameter(model, conv) if model.get('da2'): logger.info('da2 %f', model.get('da2') / 1e3) ag = (model.get('bore_diam') - model.get('da2') / 1e3) / 2 model.set_value('airgap', ag) model.magnet['dxf'] = dict(fsl=conv['fsl']) self.fsl_magnet = True del model.magnet[templ]
def prepare_stator(self, model): templ = model.statortype() if templ == 'mshfile': import femagtools.gmsh g = femagtools.gmsh.Gmsh(model.stator['mshfile']['name']) phi = g.get_section_angles() model.stator['num_slots'] = round(math.pi / (phi[1] - phi[0])) r = g.get_section_radius() model.set_value('outer_diam', 2 * r[1]) model.set_value('bore_diam', 2 * r[0]) model.stator['stator_msh'] = dict( name=model.stator['mshfile']['name']) for sr in g.get_subregions(): model.stator[sr] = g.get_location(sr) for k in ('yoke', 'teeth', 'air'): model.stator[k] = model.stator['mshfile'].get(k, []) wdg = model.stator['mshfile'].get('wdg', '') if wdg: model.stator['wdg'] = model.stator[wdg] del model.stator['mshfile'] self.fsl_stator = True return if templ != 'dxffile': return logger.info("Conv stator from %s", model.stator['dxffile']['name']) params = {} params['split'] = model.stator[templ].get('split', False) params['show_plots'] = model.stator[templ].get('plot', False) params['write_fsl'] = True params['airgap'] = -1.0 pos = 'in' if model.external_rotor else 'out' params['part'] = ('stator', pos) conv = convert(model.stator['dxffile']['name'], **params) model.stator['num_slots'] = conv.get('tot_num_slot') self.set_diameter_parameter(model, conv) if model.get('dy1'): model.set_value('outer_diam', model.get('dy1')) model.set_value('bore_diam', model.get('da1')) model.stator['dxf'] = dict(fsl=conv['fsl']) self.fsl_stator = True del model.stator[templ]
def prepare_model_with_dxf(self, model): dxfname = model.dxffile.get('name', None) if not dxfname: logger.error('Name of dxf-file expected') return [] if dxfname.split('.')[-1] not in ('dxf'): dxfname += '.dxf' if not os.path.isfile(dxfname): logger.error('File {} not found'.format(dxfname)) return [] params = {} params['split'] = model.dxffile.get('split', False) params['show_plots'] = model.dxffile.get('plot', False) params['write_fsl'] = True params['airgap'] = model.dxffile.get('airgap', 0.0) params['nodedist'] = model.dxffile.get('nodedist', 1) conv = convert(dxfname, **params) model.set_value('poles', conv.get('num_poles')) model.set_value('outer_diam', conv.get('dy1') * 1e-3) model.set_value('bore_diam', conv.get('da1') * 1e-3) model.set_value('inner_diam', conv.get('dy2') * 1e-3) model.set_value('airgap', (conv.get('da1') - conv.get('da2')) / 2 / 1e3) model.set_value('agndst', conv.get('agndst') * 1e-3) if not hasattr(model, 'stator'): setattr(model, 'stator', {}) model.stator['num_slots'] = conv.get('tot_num_slot') model.stator['num_slots_gen'] = conv.get('num_sl_gen') if 'fsl_stator' in conv: self.fsl_stator = True model.stator['dxf'] = dict(fsl=conv['fsl_stator']) if not hasattr(model, 'magnet'): setattr(model, 'magnet', {}) if 'fsl_magnet' in conv: self.fsl_magnet = True model.magnet['dxf'] = dict(fsl=conv['fsl_magnet'])
def prepare_stator(self, model): templ = model.statortype() if templ != 'dxffile': return logger.info("Conv stator from %s", model.stator['dxffile']['name']) params = {} params['split'] = model.stator[templ].get('split', False) params['show_plots'] = model.stator[templ].get('plot', False) params['write_fsl'] = True params['airgap'] = -1.0 pos = 'in' if model.external_rotor else 'out' params['part'] = ('stator', pos) conv = convert(model.stator['dxffile']['name'], **params) model.stator['num_slots'] = conv.get('tot_num_slot') self.set_diameter_parameter(model, conv) if model.get('dy1'): model.set_value('outer_diam', model.get('dy1')) model.set_value('bore_diam', model.get('da1')) model.stator['dxf'] = dict(fsl=conv['fsl']) self.fsl_stator = True del model.stator[templ]
def prepare_rotor(self, model): templ = model.magnettype() if templ != 'dxffile': return params = {} params['split'] = model.magnet[templ].get('split', False) params['show_plots'] = model.magnet[templ].get('plot', False) params['write_fsl'] = True params['airgap'] = -1.0 pos = 'out' if model.external_rotor else 'in' params['part'] = ('rotor', pos) logger.info("Conv rotor from %s", templ + '.dxf') conv = convert(model.magnet[templ]['name'], **params) model.set_value('poles', int(conv.get('num_poles'))) self.set_diameter_parameter(model, conv) if model.get('da2'): logger.info('da2 %f', model.get('da2') / 1e3) ag = (model.get('bore_diam') - model.get('da2') / 1e3) / 2 model.set_value('airgap', ag) model.magnet['dxf'] = dict(fsl=conv['fsl']) self.fsl_magnet = True del model.magnet[templ]
def main(): argparser = argparse.ArgumentParser( description='Process DXF file and create a plot or FSL file.') argparser.add_argument('dxfile', help='name of DXF file') argparser.add_argument('--inner', help='name of inner element', dest='inner', default='inner') argparser.add_argument('--outer', help='name of outer element', dest='outer', default='outer') argparser.add_argument('--rotor', help='rotor without airgap in/out', dest='rotor', default='') argparser.add_argument('--stator', help='stator without airgap in/out', dest='stator', default='') argparser.add_argument('-a', '--airgap', help='correct airgap', dest='airgap', type=float, default=0.0) argparser.add_argument('--airgap2', help='correct airgap', dest='airgap2', type=float, default=0.0) argparser.add_argument('-t', '--symtol', help='absolut tolerance to find symmetry axis', dest='sym_tolerance', type=float, default=0.001) argparser.add_argument('--mindist', help='minimal distance of spline control-points', dest='mindist', type=float, default=0.01) argparser.add_argument('--rtol', help='relative tolerance (pickdist)', dest='rtol', type=float, default=1e-03) argparser.add_argument('--atol', help='absolut tolerance (pickdist)', dest='atol', type=float, default=0.005) argparser.add_argument('--da', help='distance airgap', dest='da', type=float, default=0.0) argparser.add_argument('--dy', help='distance yoke', dest='dy', type=float, default=0.0) argparser.add_argument('-s', '--split', help='split intersections', dest='split', action="store_true") argparser.add_argument('-p', '--plot', help='show plots', dest='show_plots', action="store_true") argparser.add_argument('--areas', help='show all areas', dest='show_areas', action="store_true") argparser.add_argument('-f', '--fsl', help='create fsl', dest='write_fsl', action="store_true") argparser.add_argument('-v', '--view', help='show a view only', dest='view', action="store_true") argparser.add_argument('-k', '--korr', help='show a view with korrections', dest='view_korr', action="store_true") argparser.add_argument('--png', help='write png-file only', dest='write_png', action="store_true") argparser.add_argument('-d', '--debug', help='print debug information in logfile', dest='debug', action="store_true") argparser.add_argument('-l', '--log', help='print information in logfile', dest='debug', action="store_true") argparser.add_argument('--version', help='show version of some packages', dest='version', action="store_true") argparser.add_argument('--debugger', help='print debug information in logfile', dest='debugger', action="store_true") args = argparser.parse_args() logfilename = None loglevel = logging.INFO if args.debug: loglevel = logging.DEBUG logfilename = 'debugger.log' print("see log-messages in {}".format(logfilename)) logging.basicConfig(level=loglevel, format='%(asctime)s %(message)s', filename=logfilename, filemode='w') if args.version: logger.info("femagtools version: %s", femagtools.__version__) try: import networkx as nx logger.info("networkx version: %s", nx.__version__) except ImportError: # ModuleNotFoundError: logger.info("networkx version: <networkx not available>") try: import matplotlib logger.info("matplotlib version: %s", matplotlib.__version__) except ImportError: # ModuleNotFoundError: logger.info("matplotlib version: <matplotlib not available>") logger.info("Python: %s", sys.version) sys.exit(0) if args.airgap > 0.0: if args.airgap2 > 0.0: logger.info("Airgap is set from {} to {}".format( args.airgap, args.airgap2)) else: logger.info("Airgap is set to {}".format(args.airgap)) part = () if args.stator: if args.rotor: logger.error("Stator or Rotor expected") sys.exit(1) part = ('stator', args.stator) elif args.rotor: part = ('rotor', args.rotor) if part: if args.airgap: logger.info('airgap in stator or rotor not possible') sys.exit(1) args.airgap = -1 # no airgap if part[1] not in ('in', 'out'): logger.info('{} has to be defined in/out'.format(part[0])) sys.exit(1) if not args.write_fsl: if not (args.show_plots or args.show_areas or args.view): args.write_fsl = True res = convert( args.dxfile, # DXF-Filename rtol=args.rtol, # relative pickdist toleranz atol=args.atol, # absolute pickdist toleranz symtol=args.sym_tolerance, mindist=args.mindist, split=args.split, inner_name=args.inner, outer_name=args.outer, part=part, airgap=args.airgap, airgap2=args.airgap2, da=args.da, # distance airgap dy=args.dy, # distance yoke view_only=args.view, view_korr=args.view_korr, show_plots=args.show_plots, show_areas=args.show_areas, write_fsl=args.write_fsl, write_png=args.write_png, debug_mode=args.debugger) if args.write_fsl: if res is not None: basename = os.path.basename(args.dxfile).split('.')[0] with io.open(basename + '.fsl', 'w', encoding='utf-8') as f: f.write('\n'.join(res['fsl']))