void CreateSymdef(OcadSymbol ocadSym) { int symid; // Version 9 allows 3 decimal digits in OCAD symbols. if (version >= 9) symid = ocadSym.Sym; else symid = (ocadSym.Sym / 10) * 1000 + (ocadSym.Sym % 10); string name = ocadSym.Description; SymDef symdef = null; switch (ocadSym.Otp) { default: throw new OcadFileFormatException("Invalid Otp value {0} in symbol {1}", ocadSym.Otp, symid); case 1: symdef = CreatePointSymdef(name, symid, ocadSym as OcadPointSymbol); break; case 2: // Line symbols. // FEATURE: Line Text symbols if (version >= 9 || ocadSym.SymTp == 0) symdef = CreateLineSymdef(name, symid, ocadSym as OcadLineSymbol); else symdef = CreateLineTextSymdef(name, symid, ocadSym as OcadLineTextSymbol); break; case 3: // Area symbols. symdef = CreateAreaSymdef(name, symid, ocadSym as OcadAreaSymbol); break; case 4: symdef = CreateTextSymdef(name, symid, ocadSym as OcadTextSymbol); break; case 5: case 7: symdef = CreateRectangleSymdef(name, symid, ocadSym as OcadRectSymbol); break; case 6: symdef = CreateLineTextSymdef(name, symid, ocadSym as OcadLineTextSymbol); break; } if (symdef != null) { #if true if (version == 9) symdef.ToolboxImage = ConvertOcad9Icon(ocadSym.IconBits); else if ((ocadSym.Flags & 2) != 0) symdef.ToolboxImage = ConvertCompressedOcadIcon(ocadSym.IconBits); else symdef.ToolboxImage = ConvertOcadIcon(ocadSym.IconBits); #endif map.AddSymdef(symdef); symdefids[symid] = symdef; if (ocadSym.Status == 2) { // symbol is hidden. map.SetSymdefVisible(symdef, false); } } }
void CreateSymdefs(OcadSymbol[] symbols) { // We need to read area symdefs after all others, because area symdefs can depend on line symdefs. foreach (OcadSymbol ocadSym in symbols) { if (ocadSym.Otp != 3) CreateSymdef(ocadSym); } foreach (OcadSymbol ocadSym in symbols) { if (ocadSym.Otp == 3) CreateSymdef(ocadSym); } }
// Fill in common parts of the OcadSymbol class: except Size, Otp, SymTp, Extent void FillInCommonSymdef(OcadSymbol symbol, SymDef symdef) { symbol.Sym = ConvertSymdefId(symdef.OcadID); symbol.Selected = false; symbol.Status = 0; symbol.FilePos = 0; List<short> colorsUsed = new List<short>(2); foreach (SymColor symcolor in map.AllColors) { if (symdef.HasColor(symcolor)) { int colorid = NumberOfColor(symcolor); symbol.ColorSet[colorid / 8] |= (byte) (1 << (colorid % 8)); if (version >= 9) colorsUsed.Add((short) colorid); } } if (version >= 9) { symbol.nColors = (short) colorsUsed.Count; symbol.ColorsUsed = colorsUsed.ToArray(); mapSymdefToSingleColor[symdef] = (colorsUsed.Count) == 1 ? colorsUsed[0] : (short) -1; // if this symdef is single-color, save that away for use in writing the objects. } symbol.Description = symdef.Name; #if false symbol.IconBits = new byte[version <= 8 ? 264 : 22 * 22]; #else symbol.IconBits = ImageToOcadIcon(symdef.ToolboxImage, version); #endif if (version == 8) symbol.Flags |= 2; if (!map.IsSymdefVisible(symdef)) { // Symbol is hidden. symbol.Status = 2; } }