Lod picker
This commit is contained in:
		| @@ -23,6 +23,7 @@ import zlib | ||||
| import xmltodict | ||||
| import os | ||||
| import app.pylddlib as ldd | ||||
| import pathlib | ||||
|  | ||||
| property_blueprint = Blueprint('properties', __name__) | ||||
|  | ||||
| @@ -206,16 +207,16 @@ def get(status="all"): | ||||
|     return data | ||||
|  | ||||
|  | ||||
| @property_blueprint.route('/view_model/<id>', methods=['GET']) | ||||
| @property_blueprint.route('/view_model/<id>/<lod>', methods=['GET']) | ||||
| @login_required | ||||
| def view_model(id): | ||||
| def view_model(id, lod): | ||||
|     property_content_data = PropertyContent.query.filter(PropertyContent.id==id).all() | ||||
|  | ||||
|     # TODO: Restrict somehow | ||||
|     formatted_data = [ | ||||
|         { | ||||
|             "obj": url_for('properties.get_model', id=property_content_data[0].id, file_format='obj'), | ||||
|             "mtl": url_for('properties.get_model', id=property_content_data[0].id, file_format='mtl'), | ||||
|             "obj": url_for('properties.get_model', id=property_content_data[0].id, file_format='obj', lod=lod), | ||||
|             "mtl": url_for('properties.get_model', id=property_content_data[0].id, file_format='mtl', lod=lod), | ||||
|             "lot": property_content_data[0].lot, | ||||
|             "id": property_content_data[0].id, | ||||
|             "pos": [{ | ||||
| @@ -232,7 +233,8 @@ def view_model(id): | ||||
|  | ||||
|     return render_template( | ||||
|         'ldd/ldd.html.j2', | ||||
|         content=formatted_data | ||||
|         content=formatted_data, | ||||
|         lod=lod | ||||
|     ) | ||||
|  | ||||
| property_center = { | ||||
| @@ -245,9 +247,9 @@ property_center = { | ||||
| } | ||||
|  | ||||
|  | ||||
| @property_blueprint.route('/view_models/<id>', methods=['GET']) | ||||
| @property_blueprint.route('/view_models/<id>/<lod>', methods=['GET']) | ||||
| @login_required | ||||
| def view_models(id): | ||||
| def view_models(id, lod): | ||||
|     property_content_data = PropertyContent.query.filter( | ||||
|         PropertyContent.property_id==id | ||||
|     ).order_by(PropertyContent.lot).all() | ||||
| @@ -273,8 +275,8 @@ def view_models(id): | ||||
|             # add new lot | ||||
|             consolidated_list.append( | ||||
|                 { | ||||
|                     "obj": url_for('properties.get_model', id=property_content_data[item].id, file_format='obj'), | ||||
|                     "mtl": url_for('properties.get_model', id=property_content_data[item].id, file_format='mtl'), | ||||
|                     "obj": url_for('properties.get_model', id=property_content_data[item].id, file_format='obj', lod=lod), | ||||
|                     "mtl": url_for('properties.get_model', id=property_content_data[item].id, file_format='mtl', lod=lod), | ||||
|                     "lot": property_content_data[item].lot, | ||||
|                     "id": property_content_data[item].id, | ||||
|                     "pos": [{ | ||||
| @@ -293,18 +295,20 @@ def view_models(id): | ||||
|         'ldd/ldd.html.j2', | ||||
|         property_data=property_data, | ||||
|         content=consolidated_list, | ||||
|         center=property_center[property_data.zone_id] | ||||
|         center=property_center[property_data.zone_id], | ||||
|         lod=lod | ||||
|     ) | ||||
|  | ||||
| @property_blueprint.route('/get_model/<id>/<file_format>', methods=['GET']) | ||||
| @property_blueprint.route('/get_model/<id>/<file_format>/<lod>', methods=['GET']) | ||||
| @login_required | ||||
| def get_model(id, file_format): | ||||
| def get_model(id, file_format, lod): | ||||
|     content = PropertyContent.query.filter(PropertyContent.id==id).first() | ||||
|  | ||||
|     if not(0 <= int(lod) <= 2): | ||||
|         abort(404) | ||||
|     if content.lot == 14: # ugc model | ||||
|         response = ugc(content)[0] | ||||
|     else: # prebuild model | ||||
|         response = prebuilt(content, file_format)[0] | ||||
|         response = prebuilt(content, file_format, lod)[0] | ||||
|  | ||||
|     response.headers.set('Content-Type', 'text/xml') | ||||
|     return response | ||||
| @@ -337,7 +341,7 @@ def ugc(content): | ||||
|     return response, ugc_data.filename | ||||
|  | ||||
|  | ||||
| def prebuilt(content, file_format): | ||||
| def prebuilt(content, file_format, lod): | ||||
|     # translate LOT to component id | ||||
|     # we need to get a type of 2 because reasons | ||||
|     render_component_id = query_cdclient( | ||||
| @@ -357,7 +361,7 @@ def prebuilt(content, file_format): | ||||
|         return f"No filename for LOT {content.lot}" | ||||
|  | ||||
|     if file_format == "lxfml": | ||||
|         lxfml = f'app/luclient/res/BrickModels/{filename.split(".")[0]}.lxfml' | ||||
|         lxfml = pathilob.Path(f'app/luclient/res/BrickModels/{filename.split(".")[0]}.lxfml') | ||||
|         with open(lxfml, 'r') as file: | ||||
|             lxfml_data = file.read() | ||||
|         # print(lxfml_data) | ||||
| @@ -365,7 +369,7 @@ def prebuilt(content, file_format): | ||||
|  | ||||
|     elif file_format in ["obj", "mtl"]: | ||||
|  | ||||
|         cache = f"app/cache/{filename}.{file_format}" | ||||
|         cache = f"app/cache/BrickModels/{filename}.lod{lod}.{file_format}" | ||||
|  | ||||
|         if not os.path.exists(cache): | ||||
|             lxfml = f'app/luclient/res/BrickModels/{filename.split(".")[0]}.lxfml' | ||||
|   | ||||
| @@ -467,16 +467,16 @@ | ||||
|     constructor(designID, database){ | ||||
|       this.designID = designID | ||||
|       this.Parts = [] | ||||
|  | ||||
|       this.studsFields2D = [] | ||||
|       let GeometryLocation = `${designID}.g` | ||||
|       let lod = {{ lod }} | ||||
|       let GeometryLocation = `lod${lod}/${designID}.g` | ||||
|       let PrimitiveLocation = `${designID}.xml` | ||||
|  | ||||
|       let GeometryCount = 0 | ||||
|       while (GeometryLocation in database.filelist) { | ||||
|         this.Parts[GeometryCount] = new GeometryReader(database.filelist[GeometryLocation].read()) | ||||
|         GeometryCount = GeometryCount + 1 | ||||
|         GeometryLocation = `${designID}.g${GeometryCount}` | ||||
|         GeometryLocation = `lod${lod}/${designID}.g${GeometryCount}` | ||||
|       } | ||||
|       let primitive = new Primitive(database.filelist[PrimitiveLocation].read()) | ||||
|       this.Partname = primitive.Designname | ||||
| @@ -1019,7 +1019,7 @@ | ||||
|       return self.filelist[filename]; | ||||
|     } | ||||
|  | ||||
|     parse(dburl) { | ||||
|     parse(dburl, folder="") { | ||||
|       let self = this; | ||||
|       let xhr = new XMLHttpRequest(); | ||||
|       xhr.open('GET', dburl, false); | ||||
| @@ -1038,10 +1038,16 @@ | ||||
|             let obj = data[i]; | ||||
|             if (obj.type == 'directory'){ | ||||
|               // parse subdirs | ||||
|               self.parse(dburl + obj.name + '/') | ||||
|               self.parse(dburl + obj.name + '/', obj.name) | ||||
|             } | ||||
|             else if (obj.type == 'file'){ | ||||
|               self.filelist[obj.name] = new DBURLFile(dburl + obj.name, obj.name) | ||||
|  | ||||
|               if (folder.includes("lod")){ | ||||
|  | ||||
|                 self.filelist[`${folder}/${obj.name}`] = new DBURLFile(dburl + obj.name, obj.name) | ||||
|               } else { | ||||
|                 self.filelist[obj.name] = new DBURLFile(dburl + obj.name, obj.name) | ||||
|               } | ||||
|             } | ||||
|             else { | ||||
|               console.log('Strange object parsed: ' + obj.type) | ||||
| @@ -1063,7 +1069,7 @@ | ||||
|   let lxfml_file_list = [ | ||||
|     {% for model in content %} | ||||
|       {% if model.lot == 14 %} | ||||
|         "{{url_for('properties.get_model', id=model.id, file_format='lxfml')}}"{{ ", " if not loop.last else "" }} | ||||
|         "{{url_for('properties.get_model', id=model.id, file_format='lxfml', lod=lod)}}"{{ ", " if not loop.last else "" }} | ||||
|       {% endif %} | ||||
|     {% endfor %} | ||||
|   ] | ||||
|   | ||||
| @@ -84,8 +84,16 @@ | ||||
|       <div class="row"> | ||||
|         <div class="col text-center"> | ||||
|             <a role="button" class="btn btn-primary btn-block" | ||||
|               href='{{ url_for('properties.view_models', id=property.id) }}'> | ||||
|               Render Property | ||||
|               href='{{ url_for('properties.view_models', id=property.id, lod=0) }}'> | ||||
|               Render: High | ||||
|             </a> | ||||
|             <a role="button" class="btn btn-primary btn-block" | ||||
|               href='{{ url_for('properties.view_models', id=property.id, lod=1) }}'> | ||||
|               Render: Medium | ||||
|             </a> | ||||
|             <a role="button" class="btn btn-primary btn-block" | ||||
|               href='{{ url_for('properties.view_models', id=property.id, lod=2) }}'> | ||||
|               Render: Low | ||||
|             </a> | ||||
|         </div> | ||||
|       </div> | ||||
|   | ||||
| @@ -44,21 +44,12 @@ | ||||
|     <div class="row"> | ||||
|       <div class="col text-center"> | ||||
|           <a role="button" class="btn btn-primary btn-block" | ||||
|             href='{{ url_for('properties.get_model', id=item.id, file_format="lxfml") }}'> | ||||
|             href='{{ url_for('properties.get_model', id=item.id, file_format="lxfml", lod=0) }}'> | ||||
|             View Model XML | ||||
|           </a> | ||||
|       </div> | ||||
|     </div> | ||||
|     <br/> | ||||
|     <div class="row"> | ||||
|       <div class="col text-center"> | ||||
|           <a role="button" class="btn btn-primary btn-block" | ||||
|             href='{{ url_for('properties.view_model', id=item.id) }}'> | ||||
|             Render Model | ||||
|           </a> | ||||
|       </div> | ||||
|     </div> | ||||
|     <br/> | ||||
|     <div class="row"> | ||||
|       <div class="col text-center"> | ||||
|           <a role="button" class="btn btn-primary btn-block" | ||||
| @@ -67,5 +58,27 @@ | ||||
|           </a> | ||||
|       </div> | ||||
|     </div> | ||||
|     <br/> | ||||
|     <h5 class="text-center"> Render </h5> | ||||
|     <div class="row"> | ||||
|       <div class="col text-center"> | ||||
|         <a role="button" class="btn btn-primary" | ||||
|           href='{{ url_for('properties.view_model', id=item.id, lod=0) }}'> | ||||
|           0 | ||||
|         </a> | ||||
|       </div> | ||||
|       <div class="col text-center"> | ||||
|         <a role="button" class="btn btn-primary" | ||||
|           href='{{ url_for('properties.view_model', id=item.id, lod=1) }}'> | ||||
|           1 | ||||
|         </a> | ||||
|       </div> | ||||
|       <div class="col text-center"> | ||||
|         <a role="button" class="btn btn-primary" | ||||
|           href='{{ url_for('properties.view_model', id=item.id, lod=2) }}'> | ||||
|           2 | ||||
|         </a> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </div> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Aaron Kimbre
					Aaron Kimbre