Jump to content
Unity Insider Forum

quieri19

Members
  • Posts

    4
  • Joined

  • Last visited

quieri19's Achievements

Newbie

Newbie (1/3)

1

Reputation

  1. Hallo zusammen, ich möchte CAD-Daten von Untiy zur Laufzeit exportieren/herunterladen (WebGL). In meinem Projekt kann man ein Modell aus verschiedenen Bauteilen erstellen werden und dieses sollte dann exportierbar sein sein (User kann sein konstruiertes Modell herunterladen). Gibt es Erweiterungen für Unity, die dies ermöglichen würden? Mein bevorzugtes Downloadformat wäre .IGES oder .Step, da diese dann am besten in CAD-Programmen eingefügt werden können. Hierzu habe ich leider nichts gefunden. Ich beginne also mit dem .STL-Format, da ich hier den StlBuilder gefunden habe und dies ein leichteres Format ist. Leider habe ich aber keinen Zugriff auf meine Meshes der einzelnen Bauteile/GameObjects zur Laufzeit. Wenn ich Quadrate aus den Boxcollidern erstelle funktioniert es (zweite Funktion). Vielleicht könnt ihr mich da unterstützen. Die Boxcollider nützen mir nichts, da ich das Mesh benötige, nur Quadrate reichen mir nicht. Mit dem MeshCollider schaffe ich es auch nicht. Gibt es generell die Möglichkeit die einzelnen Meshes zu kombinieren und das Gesamte Mesh direkt als eine Datei herunter zu laden, am besten mit Wunsch-Dateiformat? Diese Version funktioniert nicht, wenn ich Direkt das Mesh verwenden möchte: /////////////////////////////////////////////////// GameObject GO = Instantiate(MyGameObject).gameObject); GO.transform.parent = Downloads.transform; var meshFilters = Downloads.GetComponentsInChildren<MeshFilter>(); List<Mesh> Liste = new List<Mesh>(); List<Transform> ListePosition = new List<Transform>(); for (int i = 0; i < meshFilters.Length; i++) { ListePosition.Add(Downloads.transform.GetChild(i).transform); //wurde oben definiert Liste.Add(meshFilters[i].mesh); } //zu Einem Object zusammenfügen, da sonst jedes Elemt einzeln expoertiert wird. Mesh[] mesh = new Mesh[1]; mesh[0] = CombineMeshes(Liste, ListePosition); ->>>>> HERE IS THE ERROR var selectedMeshes = mesh.Select(filter => new MeshContainer() { Mesh = mesh[0], Translation = new Vector3(0, 0, 0) // - Selection.activeGameObject.transform.position //Weg Sonst geht es nicht mehr. }); var meshExport = STLBuilder.Mesh.Build("UnityExport", selectedMeshes.ToArray()); var stlFile = StlBuilder.Build(meshExport); StartCoroutine(StartDownload("3D_File", stlFile, ".stl")); /////////////////////////////////////////////////// private Mesh CombineMeshes(List<Mesh> meshes, List<Transform> _transform) { var combine = new CombineInstance[meshes.Count]; for (int i = 0; i < meshes.Count; i++) { combine[i].mesh = meshes[i]; combine[i].transform = _transform[i].localToWorldMatrix; } var mesh = new Mesh(); mesh.CombineMeshes(combine); return mesh; } ERROR-Message: Cannot combine mesh that does not allow access: 3DModell Instance UnityEngine.Mesh:CombineMeshes (UnityEngine.CombineInstance[]) DownloadModell:CombineMeshes (System.Collections.Generic.List`1<UnityEngine.Mesh>,System.Collections.Generic.List`1<UnityEngine.Transform>) (at Assets/Scripts/DownloadModell.cs:483) DownloadModell:StartDownloadSTLMeshes () (at Assets/Scripts/DownloadModell.cs:218) DownloadModell:<Awake>b__10_1 () (at Assets/Scripts/DownloadModell.cs:34) UnityEngine.EventSystems.EventSystem:Update () So Funktioniert es public void StartDownloadSTLBoxCollider() { //Hole alle Boxcollider var collidersObj = Schachtkonfigurator._schachtkonfigurator.Schacht.GetComponentsInChildren<BoxCollider>(); //Erzeuge Alle Wuerfel for (var index = 0; index < collidersObj.Length; index++) { GenerateGameobject(collidersObj[index].GetComponent<BoxCollider>().size); GameObject GO = GameObject.Find("CubeX"); GO.name = GO.name + index.ToString(); GO.transform.parent = Downloads.transform; GO.transform.rotation = collidersObj[index].gameObject.transform.rotation; Vector3 v3 = new Vector3(collidersObj[index].transform.parent.position.x, collidersObj[index].transform.parent.position.y, collidersObj[index].transform.parent.position.z); //Brauche Hier ParentPosition, da nur diese ok ist if (v3.x < 0) v3.x -= collidersObj[index].center.x; else v3.x += collidersObj[index].center.x; if (v3.y < 0) v3.y -= collidersObj[index].center.y; else v3.y += collidersObj[index].center.y; if (v3.z < 0) v3.z -= collidersObj[index].center.z; else v3.z += collidersObj[index].center.z; //v3.x += collidersObj[index].center.x; //v3.y += collidersObj[index].center.y; //v3.z += collidersObj[index].center.z; GO.transform.position = v3; } var meshFilters = Downloads.GetComponentsInChildren<MeshFilter>(); //Versuch zu combinieren hat aber nicht funktioniert List<Mesh> Liste = new List<Mesh>(); List<Transform> ListePosition = new List<Transform>(); for (int i = 0; i < meshFilters.Length; i++) { ListePosition.Add(Downloads.transform.GetChild(i).transform); //wurde oben definiert Liste.Add(meshFilters[i].mesh); } //zu Einem Object zusammenfügen, da sonst jedes Elemt einzeln expoertiert wird. Mesh[] mesh = new Mesh[1]; mesh[0] = CombineMeshes(Liste, ListePosition); var selectedMeshes = mesh.Select(filter => new MeshContainer() { Mesh = mesh[0], Translation = new Vector3(0, 0, 0) // - Selection.activeGameObject.transform.position //Weg Sonst geht es nicht mehr. }); var meshExport = STLBuilder.Mesh.Build("UnityExport", selectedMeshes.ToArray()); var stlFile = StlBuilder.Build(meshExport); StartCoroutine(StartDownload("3D_File", stlFile, ".stl")); } Vielen Dank! LG
  2. Hallo malzbie, vielen Dank dass du Dir so viel Arbeit machst, aber irgendwie komme ich mit SharpPDF, oder generell PDF in Unity erzeugen nicht weiter. ->Deshalb neue Vorgehensweise: Ich hole mir die Bilder und Daten die ich brauche und sende Sie per Post an ein Python-Programm, dort gibt es eine gute Library mit der ich mir dann das PDF mit den zuvor geschickten Daten sauber erstellen kann und als Download zur Verfügung stellen kann. Hier die funktionierende Testumgebung falls jemand so etwas mal braucht. StartCoroutine(postRequest("http://127.0.0.1:5000/sendfile")); IEnumerator postRequest(string url) { WWWForm form = new WWWForm(); form.AddField("Datenblatt ", X.transform.GetChild(0).GetComponent<ElementDaten> RawImage image1 = Schachtkonfigurator._schachtkonfigurator.Info.transform.Find("Bild_canBelastungsklasse").GetComponent<RawImage>(); Texture2D _2D = (Texture2D)image1.texture; SetTextureImporterFormat(_2D, true); Texture2D decopmpresseTex = ExtensionMethod.DeCompress(_2D); byte[] _byte = decopmpresseTex.EncodeToPNG(); form.AddBinaryData("profilePictureImage", _byte, "Pic.png", "image/png"); UnityWebRequest uwr = UnityWebRequest.Post(url, form); yield return uwr.SendWebRequest(); if (uwr.isNetworkError) { Debug.Log("Error While Sending: " + uwr.error); } else { Debug.Log("Received: " + uwr.downloadHandler.text); } } Test: from flask import Flask, request import json import os app = Flask(__name__) @app.route('/sendfile', methods=['GET', 'POST']) def hello_world(): if request.method == 'POST': print(request.form) imagefile = request.files.get('profilePictureImage', '') imagefile.save(os.path.join('./static', imagefile.filename)) return json.dumps({'success': True}), 200, {'ContentType': 'application/json'} return json.dumps({'success': True}), 400, {'ContentType': 'application/json'} if __name__ == '__main__': app.run(debug=True) Dann stehen Daten und Bilder sauber zur Verfügung.
  3. Hallo malzbie, vielen Dank für deine Unterstützung, da hast du recht, ich war selber gerade erstaunt, wenn man das PDF direkt in diesem Forum wieder herunterlädt und im Chrome öffnet, wird das Bild (zwar nur ein Ausschnitt) richtig angezeigt. Macht man das heruntergeladene PDF aber zum Beispiel mit Adobe auf, ist das Bild total verzerrt und du kannst meinen Fehler erkennen. Wahrscheinlich werden hier nur Bytes verschoben, das ist aber doch schon mal ein guter Hinweis. Wollte das PDF deshalb zunächst einmal lokal erstellen und wenn das funktioniert, einen PostRequest senden (Nutze hier WWWForm und UnityWebRequest). Generell wird sharpPDF verwendet. Im direkten Download verwende ich BufferedStream so schafft man es, dass wenigstens was verzerrtes drauf ist^^. Das PDF soll aber später Online (WebGL) erzeugt werden Wenn ich das PDF aber per PostRequest an mein PHP schicke, dann wandelt er mir leider das Bild um und ich sehe (mit Notepad++), dass aus den Bytes des Bildes dann nur noch ??? eingesetzt werden. Der Text und die Tabellen des PDF´s funktionieren. Wenn das Bild mitgeschickt wird, ist dadurch die PDF ganz zerstört und das PDF kann nicht geöffnet werden. Liegt wahrscheinlich an UTF-8 / ASCII aber das hab ich auch noch nicht raus gefunden. Deshalb wie gesagt zunächst einmal lokal erstellen, wenn das funktioniert dann Web. Vielleicht weiß hier jemand weiter, oder kennt einen anderen Weg um ein PDF in Unity zu erzeugen. Ich hoffe das hilft Dir, vielleicht hast du aber auch den Code den du für minuschki gelöst hast, er hatte ja ein Ähnliches Problem. DAS WÄRE WAHNSINN, vielen DANK. Bytestream des funktionierenden PDF beim PostRequest:: 20 0 obj << /Type /XObject /Subtype /Image /Name /I20 /Filter /DCTDecode /Width 300 /Height 300 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 49548 >> stream ÿØÿà JFIF ÿÛ C $.' ",#(7),01444'9=82<.342ÿÛ C 2!!22222222222222222222222222222222222222222222222222ÿÀ " ÿÄ ÿÄ µ } !1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿÄ µ w !1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÚ ? ùþŠ( Š( Š( Š( etc. Bytestream des NICHT-funktionierenden PDF beim PostRequest: 24 0 obj << /Type /XObject /Subtype /Image /Name /I24 /Filter /DCTDecode /Width 300 /Height 300 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 49548 >> stream ???? JFIF ?? C $.' ",#(7),01444'9=82<.342?? C 2!!22222222222222222222222222222222222222222222222222?? " ?? ?? ? } !1AQa"q2???#B??R??$3br? %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz??????????????????????????????????????????????????????????????????????????? ?? ? w !1AQaq"2?B???? #3R?br? $4?%?&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?????????????????????????????????????????????????????????????????????????? ? ???(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??*X????c?G.@P?M EEt??)=4? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&???S_?m^??H????I P=?????/?b?@Q@Q@Q@Q@Q@T????QF?\????? {?O???(?\?# ?|?s???N;u??l?*??+k{u?!???h??h?l???????XaXWlk?r2RkF? (?? (?? (?? etc..
  4. Hallo zusammen, ich möchte mit Unity on Runtime ein PDF erstellen. An sich funktioniert das schon so weit. Es lässt sich lokal, oder über ein PHP Skript im Web herunterladen. Leider lassen sich aber keine Bilder in das PDF einfügen. Habe schon diverse Ansätze versucht, leider komme ich hier nicht weiter, vielleicht kann mich hier jemand unterstützen. Bin auch schon auf den Betrag von @minuschki https://forum.unity-community.de/profile/7222-minuschki/ gestoßen, aber leider komme ich mit diesem Beitrag auch nicht weiter: Hier mein Code V1: Lokaler Download: public void CreatePDF(string Filename) { pdfDocument myDoc = new pdfDocument("Sample Application", "Me", false); pdfPage myFirstPage = myDoc.addPage(); // Debug.Log ( "Continue to create PDF"); myFirstPage.addText("Ein PDF-Datenblatt erstellen...", 10, 730, predefinedFont.csHelveticaOblique, 30, new pdfColor(predefinedColor.csBlack)); RawImage image1 = Schachtkonfigurator._schachtkonfigurator.Info.transform.Find("Bild_canBelastungsklasse").GetComponent<RawImage>(); Texture2D _2D = (Texture2D)image1.texture; SetTextureImporterFormat(_2D, true); Texture2D decopmpresseTex = ExtensionMethod.DeCompress(_2D); byte[] _byte = decopmpresseTex.EncodeToJPG(); //Texture2D _2D = TextureToTexture2D(image1.texture, 100, 100); //byte[] _byte = _2D.EncodeToJPG(); //color1.a = 1f; myFirstPage.addImage(_byte, 10, 5, 300, 300); /*Table's creation*/ pdfTable myTable = new pdfTable(); //Set table's border myTable.borderSize = 1; myTable.borderColor = new pdfColor(predefinedColor.csDarkBlue); /*Add Columns to a grid*/ myTable.tableHeader.addColumn(new pdfTableColumn("Model", predefinedAlignment.csRight, 120)); myTable.tableHeader.addColumn(new pdfTableColumn("Speed", predefinedAlignment.csCenter, 120)); myTable.tableHeader.addColumn(new pdfTableColumn("Weight", predefinedAlignment.csLeft, 150)); myTable.tableHeader.addColumn(new pdfTableColumn("Color", predefinedAlignment.csLeft, 150)); pdfTableRow myRow = myTable.createRow(); myRow[0].columnValue = "A"; myRow[1].columnValue = "100 km/h"; myRow[2].columnValue = "180Kg"; myRow[3].columnValue = "Orange"; myTable.addRow(myRow); pdfTableRow myRow1 = myTable.createRow(); myRow1[0].columnValue = "B"; myRow1[1].columnValue = "130 km/h"; myRow1[2].columnValue = "150Kg"; myRow1[3].columnValue = "Yellow"; myTable.addRow(myRow1); /*Set Header's Style*/ myTable.tableHeaderStyle = new pdfTableRowStyle(predefinedFont.csCourierBoldOblique, 12, new pdfColor(predefinedColor.csBlack), new pdfColor(predefinedColor.csLightBlue)); /*Set Row's Style*/ myTable.rowStyle = new pdfTableRowStyle(predefinedFont.csCourier, 8, new pdfColor(predefinedColor.csBlack), new pdfColor(predefinedColor.csWhite)); /*Set Alternate Row's Style*/ myTable.alternateRowStyle = new pdfTableRowStyle(predefinedFont.csCourier, 8, new pdfColor(predefinedColor.csBlack), new pdfColor(predefinedColor.csWhite)); /*Set Cellpadding*/ myTable.cellpadding = 10; /*Put the table on the page object*/ myFirstPage.addTable(myTable, 5, 495); myDoc.createPDF(Filename); } private Texture2D TextureToTexture2D(Texture texture, int wid, int heig) { Texture2D texture2D = new Texture2D(wid, heig, TextureFormat.RGBA32, false); RenderTexture currentRT = RenderTexture.active; RenderTexture renderTexture = RenderTexture.GetTemporary(wid, heig, 32); Graphics.Blit(texture, renderTexture); RenderTexture.active = renderTexture; texture2D.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0); texture2D.Apply(); RenderTexture.active = currentRT; RenderTexture.ReleaseTemporary(renderTexture); return texture2D; } public void createPDF(string outputFile) { FileStream _myFileOut = null;; try { _myFileOut = new FileStream(outputFile, FileMode.Create); createPDF(_myFileOut); } catch (IOException exIO) { throw new pdfWritingErrorException("Errore nella scrittura del file",exIO); } catch (pdfWritingErrorException exPDF) { throw new pdfWritingErrorException("Errore nella scrittura del PDF",exPDF); } finally { if (_myFileOut != null) { _myFileOut.Close(); _myFileOut = null; } } } public void createPDF(Stream outStream) { BufferedStream _myBuffer = null; long _bufferLength = 0; initializeObjects(); try { //Bufferedstream's initialization _myBuffer = new BufferedStream(outStream); //PDF's definition _bufferLength += writeToBuffer(_myBuffer , @"%PDF-1.4" + Convert.ToChar(13) + Convert.ToChar(10)); //PDF's header object _trailer.addObject(_bufferLength.ToString()); _bufferLength += writeToBuffer(_myBuffer, _header.getText()); //PDF's info object _trailer.addObject(_bufferLength.ToString()); _bufferLength += writeToBuffer(_myBuffer, _info.getText()); //PDF's outlines object _trailer.addObject(_bufferLength.ToString()); _bufferLength += writeToBuffer(_myBuffer, _outlines.getText()); //PDF's bookmarks foreach(pdfBookmarkNode Node in _outlines.getBookmarks()) { _trailer.addObject(_bufferLength.ToString()); _bufferLength += writeToBuffer(_myBuffer, Node.getText()); } //Fonts's initialization foreach (pdfFont font in _fonts) { _trailer.addObject(_bufferLength.ToString()); _bufferLength += writeToBuffer(_myBuffer, font.getText()); } //PDF's pagetree object _trailer.addObject(_bufferLength.ToString()); _bufferLength += writeToBuffer(_myBuffer, _pageTree.getText()); //Generation of PDF's pages foreach(pdfPage page in _pages) { _trailer.addObject(_bufferLength.ToString()); _bufferLength += writeToBuffer(_myBuffer, page.getText()); foreach (pdfElement element in page.elements) { //if (element.GetType().Name == "imageElement") { if (element is imageElement) { _trailer.addObject(_bufferLength.ToString()); _bufferLength += writeToBuffer(_myBuffer, element.getText()); _trailer.addObject(_bufferLength.ToString()); _bufferLength += writeToBuffer(_myBuffer, ((imageElement)element).getXObjectText()); _bufferLength += writeToBuffer(_myBuffer, "stream" + Convert.ToChar(13) + Convert.ToChar(10)); _bufferLength += writeToBuffer(_myBuffer, ((imageElement)element).content); _bufferLength += writeToBuffer(_myBuffer, Convert.ToChar(13).ToString()); _bufferLength += writeToBuffer(_myBuffer, Convert.ToChar(10).ToString()); _bufferLength += writeToBuffer(_myBuffer, "endstream" + Convert.ToChar(13) + Convert.ToChar(10)); _bufferLength += writeToBuffer(_myBuffer, "endobj" + Convert.ToChar(13) + Convert.ToChar(10)); } else { _trailer.addObject(_bufferLength.ToString()); _bufferLength += writeToBuffer(_myBuffer, element.getText()); } } } //PDF's trailer object _trailer.xrefOffset = _bufferLength; _bufferLength += writeToBuffer(_myBuffer, _trailer.getText()); //Buffer's flush _myBuffer.Flush(); } catch (IOException ex) { throw new pdfWritingErrorException("Errore nella scrittura del PDF",ex); } finally { if (_myBuffer != null) { _myBuffer.Close(); _myBuffer = null; } } } Das Ergebnis ist hier zu sehen. Das Bild wird einfach nicht richtig angezeigt. Vielen Dank für eure Unterstützung. Beste Grüße quieri19 test.pdf
×
×
  • Create New...