cart: empty [ Login ]

Insert several objects in model

1 
Kai
1/31/2019 1:21 PM
Hello, there is a problem by instert several objects (dxf drawings) into a model. I habe an array of dxf drawings. So I want to insert all this into the same model. A foreach loop is in use where the methode "AddToModel" is called serval times.
C# Code:
//Klasseninstanz erzeugen und Get/Set ausführen Element element = serializer.Deserialize<Element>(_strObject); element.SetAppRechte = sAppRechte; //Model behandeln---------------------------- //Bei Überlagerung mehrer Zeichnungen wird eine Schleife gebildet; Die Prüfung auf Existenz des Arrays "dxf" ist bereits erfolgt foreach (string strSingleDxf in dxf) { strPfadElem = _model.GetSetPfadElement + "\\" + strSingleDxf; //Dateipfad des Elements generieren if (element.AddToModel(_MapModel, strPfadElem, ref strLogTemp)) iDrawSet++; if (!strLogTemp.Equals(string.Empty)) _strLoggMsg += _strLoggMsg != "" ? "\n\r" : "" + strLogTemp; }
Here is the methode "AddToModel" and "AddEntities" of my class element. The position of x axis an y axis is allways the same: PosX = 20.0, PosY = -50.0.
C# Code:
/// <summary> /// Fügt ein Element dem Gesamt Model hinzu /// </summary> /// <param name="mapAModel">Gibt eine List aller vorhanden Models an</param> /// <param name="strPfadElem">Gibt den Dateipfad des Elements an welches in das Gesamtmodel eingefügt werden soll</param> /// <param name="strLoggMsg">Gibt eine Referenz auf den Log-String an</param> /// <returns>Ist der Clone des Elements erfolgreich im Gesamtmodel eingefügt dann ist Rückgabewert "true", ansonsten "false"</returns> internal bool AddToModel(Dictionary<string, MyModel> mapAModel, string strPfadElem, ref string strLoggMsg) { bool BRet = false; double dRot = 0.0; List<string> liLayerName = new List<string>(); List<string> liPathEntity = new List<string>(); string strLayerTemp = string.Empty, strLayerModel = string.Empty, strTemp = string.Empty; MyModel model = mapAModel["basic"]; //Zeichnungspfad analysieren strTemp = Path.GetDirectoryName(strPfadElem); if(strTemp.Equals(string.Empty)) liPathEntity.Add("Verzeichnis fehlt"); strTemp = Path.GetFileName(strPfadElem); if (strTemp.Equals(string.Empty)) liPathEntity.Add("Dateiname fehlt"); strTemp = Path.GetExtension(strPfadElem); if (strTemp.Equals(string.Empty)) liPathEntity.Add("Dateityp fehlt"); else if(!strTemp.Equals(".dxf")) liPathEntity.Add("Dateityp nicht kompatibel"); if (liPathEntity.Count.Equals(0)) { //Ermitteln, welche Layer im "model" aktiviert sind foreach (var lay in model.Layers) { //Layer "0" ausblenden oder nicht if (lay.Name != "0") { liLayers.Add(lay); liLayerName.Add(lay.Name); } } //Drehrichtung definieren; Wird bereits beim Clonen des Model angewendet dRot = Rot * (sAppRechte.BDxfRotPositivRechts ? -1.0 : 1.0); //Datei in Dxf-Model einlesen und Model clonen DxfModel targetModel = new DxfModel(); DxfModel sourceModel = DxfReader.Read(strPfadElem); if (Model.CloneModel(sourceModel, targetModel, dRot)) { targetModel.ResetHandles(); addLineTypes(model, targetModel); addLayerColors(model, targetModel); BRet = AddEntities(model, targetModel, ref strLayerTemp); if (!BRet) { strLayerModel = String.Join(",", liLayerName.ToArray()); //Meldung generieren: Keiner Layer der Zeichnung kann verwendet werden. strLoggMsg = "Kein erforderlicher Layer konnte in der Zeichnung ermittelt werden"; strLoggMsg += string.Format("\r\nZeichnung: {0}", strPfadElem); strLoggMsg += string.Format("\r\nErforderliche Layer: {0}", strLayerModel); strLoggMsg += string.Format("\r\nVorhandene Layer: {0}", strLayerTemp); } } else { //Meldung generieren: Von der Datei konnten keine Kopie angelegt werdern. strLoggMsg = string.Format("Von der angegebenen Quelle \"{0}\" konnte kein Kopie angelegt werden", strPfadElem); } } else { strTemp = String.Join(", ", liPathEntity.ToArray()); strLoggMsg = "Auf die Zeichnung kann nicht zugegriffen werden da der Pfad nicht korrekt ist"; strLoggMsg += "\n\r" + string.Format("Folgende Fehler sind aufgetreten: {0}", strTemp); } return BRet; } private bool AddEntities(DxfModel model, DxfModel templateModel, ref string strLayerTemp) { bool BRet = false; List<string> liLayerTemp = new List<string>(); //Matrix4D rotationMatrix = Transformation4D.RotateZ(0.0 * Math.PI); foreach (DxfEntity item in templateModel.Entities) { if (liLayers.Find(item.Layer.Equals) != null) { item.TransformMe(new TransformConfig(), Transformation4D.Translation(PosX, PosY, 0)); model.Entities.Add(item); BRet = true; } foreach (DxfLayer dxfLayer in liLayers) { if (dxfLayer.Name == item.Layer.Name) { item.TransformMe(new TransformConfig(), Transformation4D.Translation(PosX, PosY, 0)); model.Entities.Add(item); BRet = true; } else { //Liste der Layers die im templateMode gesucht werden erstellen if(!liLayerTemp.Contains(item.Layer.Name)) liLayerTemp.Add(item.Layer.Name); } } } if(liLayerTemp.Count > 0) strLayerTemp = String.Join(",", liLayerTemp.ToArray()); return BRet; }
The result is that the drawings (arrows) are landing on several positions like a cascade. Positions from the middel to bottom right. Elements.pdf and Elements.dxf Is there something I forgot to do. Reset a target model or a template model or other things? Thanks for help!
Wout
1/31/2019 3:11 PM
Hi, This doesn't look like a CadLib bug to be honest. You'll have to order a support ticket here for me to look into it. - Wout
1