@jetta/axle-load-calculator 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/ai_changelog/INDEX.md +13 -0
- package/.cursor/ai_changelog/_TEMPLATE.md +55 -0
- package/.cursor/rules/code-standards.mdc +103 -0
- package/.cursor/rules/knowledge-base.mdc +14 -0
- package/.cursor/rules/planning-standards.mdc +55 -0
- package/.cursor/skills/document-feature-knowledge/SKILL.md +51 -0
- package/README.md +49 -0
- package/bitbucket-pipelines.yml +81 -0
- package/build/core/contracts/chassi_reference.d.ts +7 -0
- package/build/core/contracts/chassi_reference.d.ts.map +1 -0
- package/build/core/contracts/chassi_reference.js +5 -0
- package/build/core/contracts/ms_faixas_contract.d.ts +13 -0
- package/build/core/contracts/ms_faixas_contract.d.ts.map +1 -0
- package/build/core/contracts/ms_faixas_contract.js +89 -0
- package/build/core/contracts/rotation_enum.d.ts +11 -0
- package/build/core/contracts/rotation_enum.d.ts.map +1 -0
- package/build/core/contracts/rotation_enum.js +9 -0
- package/build/core/contracts/suspension_type.d.ts +5 -0
- package/build/core/contracts/suspension_type.d.ts.map +1 -0
- package/build/core/contracts/suspension_type.js +4 -0
- package/build/core/contracts/transport_record.d.ts +5 -0
- package/build/core/contracts/transport_record.d.ts.map +1 -0
- package/build/core/contracts/transport_record.js +1 -0
- package/build/core/contracts/vehicle_type.d.ts +12 -0
- package/build/core/contracts/vehicle_type.d.ts.map +1 -0
- package/build/core/contracts/vehicle_type.js +10 -0
- package/build/core/contracts/vehicle_version.d.ts +8 -0
- package/build/core/contracts/vehicle_version.d.ts.map +1 -0
- package/build/core/contracts/vehicle_version.js +7 -0
- package/build/core/contracts/wire_flags.d.ts +27 -0
- package/build/core/contracts/wire_flags.d.ts.map +1 -0
- package/build/core/contracts/wire_flags.js +26 -0
- package/build/core/math/float_tools.d.ts +7 -0
- package/build/core/math/float_tools.d.ts.map +1 -0
- package/build/core/math/float_tools.js +14 -0
- package/build/core/math/gaussian_elimination.d.ts +8 -0
- package/build/core/math/gaussian_elimination.d.ts.map +1 -0
- package/build/core/math/gaussian_elimination.js +85 -0
- package/build/core/orchestration/axle_weight_physics.d.ts +7 -0
- package/build/core/orchestration/axle_weight_physics.d.ts.map +1 -0
- package/build/core/orchestration/axle_weight_physics.js +27 -0
- package/build/core/orchestration/collision_checker.d.ts +6 -0
- package/build/core/orchestration/collision_checker.d.ts.map +1 -0
- package/build/core/orchestration/collision_checker.js +67 -0
- package/build/core/orchestration/connector_payload_builder.d.ts +11 -0
- package/build/core/orchestration/connector_payload_builder.d.ts.map +1 -0
- package/build/core/orchestration/connector_payload_builder.js +67 -0
- package/build/core/orchestration/java_mass_center.d.ts +9 -0
- package/build/core/orchestration/java_mass_center.d.ts.map +1 -0
- package/build/core/orchestration/java_mass_center.js +79 -0
- package/build/core/orchestration/output_builder.d.ts +11 -0
- package/build/core/orchestration/output_builder.d.ts.map +1 -0
- package/build/core/orchestration/output_builder.js +15 -0
- package/build/core/orchestration/request_schema.d.ts +65 -0
- package/build/core/orchestration/request_schema.d.ts.map +1 -0
- package/build/core/orchestration/request_schema.js +20 -0
- package/build/core/orchestration/weight_by_axis_task.d.ts +7 -0
- package/build/core/orchestration/weight_by_axis_task.d.ts.map +1 -0
- package/build/core/orchestration/weight_by_axis_task.js +105 -0
- package/build/core/physics/items/allocated_item.d.ts +22 -0
- package/build/core/physics/items/allocated_item.d.ts.map +1 -0
- package/build/core/physics/items/allocated_item.js +29 -0
- package/build/core/physics/items/allocated_item_manager.d.ts +31 -0
- package/build/core/physics/items/allocated_item_manager.d.ts.map +1 -0
- package/build/core/physics/items/allocated_item_manager.js +38 -0
- package/build/core/physics/items/center_of_mass.d.ts +14 -0
- package/build/core/physics/items/center_of_mass.d.ts.map +1 -0
- package/build/core/physics/items/center_of_mass.js +24 -0
- package/build/core/physics/items/compute_grouper_center_of_mass.d.ts +19 -0
- package/build/core/physics/items/compute_grouper_center_of_mass.d.ts.map +1 -0
- package/build/core/physics/items/compute_grouper_center_of_mass.js +28 -0
- package/build/core/physics/items/item_templates.d.ts +32 -0
- package/build/core/physics/items/item_templates.d.ts.map +1 -0
- package/build/core/physics/items/item_templates.js +53 -0
- package/build/core/physics/items/multi_container_allocated_items.d.ts +37 -0
- package/build/core/physics/items/multi_container_allocated_items.d.ts.map +1 -0
- package/build/core/physics/items/multi_container_allocated_items.js +91 -0
- package/build/core/physics/items/rotation_transforms.d.ts +8 -0
- package/build/core/physics/items/rotation_transforms.d.ts.map +1 -0
- package/build/core/physics/items/rotation_transforms.js +21 -0
- package/build/core/physics/models/axle_weight_model.d.ts +32 -0
- package/build/core/physics/models/axle_weight_model.d.ts.map +1 -0
- package/build/core/physics/models/axle_weight_model.js +72 -0
- package/build/core/physics/models/bi_truck_model.d.ts +21 -0
- package/build/core/physics/models/bi_truck_model.d.ts.map +1 -0
- package/build/core/physics/models/bi_truck_model.js +60 -0
- package/build/core/physics/models/bi_truck_tractor_semi_trailer_model.d.ts +21 -0
- package/build/core/physics/models/bi_truck_tractor_semi_trailer_model.d.ts.map +1 -0
- package/build/core/physics/models/bi_truck_tractor_semi_trailer_model.js +69 -0
- package/build/core/physics/models/bitrem_model.d.ts +33 -0
- package/build/core/physics/models/bitrem_model.d.ts.map +1 -0
- package/build/core/physics/models/bitrem_model.js +123 -0
- package/build/core/physics/models/chassi_forces.d.ts +30 -0
- package/build/core/physics/models/chassi_forces.d.ts.map +1 -0
- package/build/core/physics/models/chassi_forces.js +39 -0
- package/build/core/physics/models/deflection/beam_deflection.d.ts +28 -0
- package/build/core/physics/models/deflection/beam_deflection.d.ts.map +1 -0
- package/build/core/physics/models/deflection/beam_deflection.js +78 -0
- package/build/core/physics/models/deflection/bitrem_deflection.d.ts +22 -0
- package/build/core/physics/models/deflection/bitrem_deflection.d.ts.map +1 -0
- package/build/core/physics/models/deflection/bitrem_deflection.js +54 -0
- package/build/core/physics/models/deflection/create_deflection_delegate.d.ts +12 -0
- package/build/core/physics/models/deflection/create_deflection_delegate.d.ts.map +1 -0
- package/build/core/physics/models/deflection/create_deflection_delegate.js +32 -0
- package/build/core/physics/models/deflection/deflection_model.d.ts +19 -0
- package/build/core/physics/models/deflection/deflection_model.d.ts.map +1 -0
- package/build/core/physics/models/deflection/deflection_model.js +23 -0
- package/build/core/physics/models/deflection/deflection_support_manager.d.ts +21 -0
- package/build/core/physics/models/deflection/deflection_support_manager.d.ts.map +1 -0
- package/build/core/physics/models/deflection/deflection_support_manager.js +40 -0
- package/build/core/physics/models/deflection/deflection_tools.d.ts +6 -0
- package/build/core/physics/models/deflection/deflection_tools.d.ts.map +1 -0
- package/build/core/physics/models/deflection/deflection_tools.js +10 -0
- package/build/core/physics/models/deflection/integration_constant_calculator.d.ts +22 -0
- package/build/core/physics/models/deflection/integration_constant_calculator.d.ts.map +1 -0
- package/build/core/physics/models/deflection/integration_constant_calculator.js +48 -0
- package/build/core/physics/models/deflection/rodotrem_deflection.d.ts +22 -0
- package/build/core/physics/models/deflection/rodotrem_deflection.d.ts.map +1 -0
- package/build/core/physics/models/deflection/rodotrem_deflection.js +47 -0
- package/build/core/physics/models/deflection/semi_reboque_deflection.d.ts +21 -0
- package/build/core/physics/models/deflection/semi_reboque_deflection.d.ts.map +1 -0
- package/build/core/physics/models/deflection/semi_reboque_deflection.js +31 -0
- package/build/core/physics/models/deflection/simple_truck_deflection.d.ts +20 -0
- package/build/core/physics/models/deflection/simple_truck_deflection.d.ts.map +1 -0
- package/build/core/physics/models/deflection/simple_truck_deflection.js +28 -0
- package/build/core/physics/models/deflection/vanderleia_deflection.d.ts +21 -0
- package/build/core/physics/models/deflection/vanderleia_deflection.d.ts.map +1 -0
- package/build/core/physics/models/deflection/vanderleia_deflection.js +41 -0
- package/build/core/physics/models/old_tare_model.d.ts +17 -0
- package/build/core/physics/models/old_tare_model.d.ts.map +1 -0
- package/build/core/physics/models/old_tare_model.js +40 -0
- package/build/core/physics/models/old_tare_scale.d.ts +7 -0
- package/build/core/physics/models/old_tare_scale.d.ts.map +1 -0
- package/build/core/physics/models/old_tare_scale.js +8 -0
- package/build/core/physics/models/old_tare_semireboque.d.ts +7 -0
- package/build/core/physics/models/old_tare_semireboque.d.ts.map +1 -0
- package/build/core/physics/models/old_tare_semireboque.js +37 -0
- package/build/core/physics/models/old_tare_truck.d.ts +7 -0
- package/build/core/physics/models/old_tare_truck.d.ts.map +1 -0
- package/build/core/physics/models/old_tare_truck.js +12 -0
- package/build/core/physics/models/old_tare_vanderleia.d.ts +7 -0
- package/build/core/physics/models/old_tare_vanderleia.d.ts.map +1 -0
- package/build/core/physics/models/old_tare_vanderleia.js +31 -0
- package/build/core/physics/models/percentage_on_axles_calculator.d.ts +19 -0
- package/build/core/physics/models/percentage_on_axles_calculator.d.ts.map +1 -0
- package/build/core/physics/models/percentage_on_axles_calculator.js +39 -0
- package/build/core/physics/models/quad_semi_trailer_model.d.ts +21 -0
- package/build/core/physics/models/quad_semi_trailer_model.d.ts.map +1 -0
- package/build/core/physics/models/quad_semi_trailer_model.js +70 -0
- package/build/core/physics/models/rodotrem_model.d.ts +33 -0
- package/build/core/physics/models/rodotrem_model.d.ts.map +1 -0
- package/build/core/physics/models/rodotrem_model.js +101 -0
- package/build/core/physics/models/semi_reboque_base.d.ts +34 -0
- package/build/core/physics/models/semi_reboque_base.d.ts.map +1 -0
- package/build/core/physics/models/semi_reboque_base.js +85 -0
- package/build/core/physics/models/semi_reboque_model.d.ts +41 -0
- package/build/core/physics/models/semi_reboque_model.d.ts.map +1 -0
- package/build/core/physics/models/semi_reboque_model.js +84 -0
- package/build/core/physics/models/simple_truck_base.d.ts +29 -0
- package/build/core/physics/models/simple_truck_base.d.ts.map +1 -0
- package/build/core/physics/models/simple_truck_base.js +57 -0
- package/build/core/physics/models/simple_truck_model.d.ts +41 -0
- package/build/core/physics/models/simple_truck_model.d.ts.map +1 -0
- package/build/core/physics/models/simple_truck_model.js +76 -0
- package/build/core/physics/models/single_container_tare.d.ts +18 -0
- package/build/core/physics/models/single_container_tare.d.ts.map +1 -0
- package/build/core/physics/models/single_container_tare.js +45 -0
- package/build/core/physics/models/tare_model.d.ts +12 -0
- package/build/core/physics/models/tare_model.d.ts.map +1 -0
- package/build/core/physics/models/tare_model.js +36 -0
- package/build/core/physics/models/vanderleia_model.d.ts +33 -0
- package/build/core/physics/models/vanderleia_model.d.ts.map +1 -0
- package/build/core/physics/models/vanderleia_model.js +100 -0
- package/build/core/physics/services/axle_weight_output_builder.d.ts +27 -0
- package/build/core/physics/services/axle_weight_output_builder.d.ts.map +1 -0
- package/build/core/physics/services/axle_weight_output_builder.js +42 -0
- package/build/core/physics/services/axle_weight_service.d.ts +20 -0
- package/build/core/physics/services/axle_weight_service.d.ts.map +1 -0
- package/build/core/physics/services/axle_weight_service.js +91 -0
- package/build/core/physics/services/cm_axle_weight_service.d.ts +12 -0
- package/build/core/physics/services/cm_axle_weight_service.d.ts.map +1 -0
- package/build/core/physics/services/cm_axle_weight_service.js +33 -0
- package/build/core/physics/services/container_corner_forces.d.ts +33 -0
- package/build/core/physics/services/container_corner_forces.d.ts.map +1 -0
- package/build/core/physics/services/container_corner_forces.js +84 -0
- package/build/core/physics/transports/axle_manager.d.ts +22 -0
- package/build/core/physics/transports/axle_manager.d.ts.map +1 -0
- package/build/core/physics/transports/axle_manager.js +34 -0
- package/build/core/physics/transports/axle_record.d.ts +21 -0
- package/build/core/physics/transports/axle_record.d.ts.map +1 -0
- package/build/core/physics/transports/axle_record.js +57 -0
- package/build/core/physics/transports/chassi.d.ts +52 -0
- package/build/core/physics/transports/chassi.d.ts.map +1 -0
- package/build/core/physics/transports/chassi.js +105 -0
- package/build/core/physics/transports/container_record.d.ts +25 -0
- package/build/core/physics/transports/container_record.d.ts.map +1 -0
- package/build/core/physics/transports/container_record.js +49 -0
- package/build/core/physics/transports/containerweight/container_max_weight_calculator.d.ts +27 -0
- package/build/core/physics/transports/containerweight/container_max_weight_calculator.d.ts.map +1 -0
- package/build/core/physics/transports/containerweight/container_max_weight_calculator.js +40 -0
- package/build/core/physics/transports/containerweight/container_tare_calculator.d.ts +28 -0
- package/build/core/physics/transports/containerweight/container_tare_calculator.d.ts.map +1 -0
- package/build/core/physics/transports/containerweight/container_tare_calculator.js +55 -0
- package/build/core/physics/transports/containerweight/container_weight_model.d.ts +15 -0
- package/build/core/physics/transports/containerweight/container_weight_model.d.ts.map +1 -0
- package/build/core/physics/transports/containerweight/container_weight_model.js +31 -0
- package/build/core/physics/transports/containerweight/merged_containers_weight_calculator.d.ts +17 -0
- package/build/core/physics/transports/containerweight/merged_containers_weight_calculator.d.ts.map +1 -0
- package/build/core/physics/transports/containerweight/merged_containers_weight_calculator.js +31 -0
- package/build/core/physics/transports/containerweight/single_container_weight_calculator.d.ts +20 -0
- package/build/core/physics/transports/containerweight/single_container_weight_calculator.d.ts.map +1 -0
- package/build/core/physics/transports/containerweight/single_container_weight_calculator.js +48 -0
- package/build/core/physics/transports/grouped_containers.d.ts +34 -0
- package/build/core/physics/transports/grouped_containers.d.ts.map +1 -0
- package/build/core/physics/transports/grouped_containers.js +68 -0
- package/build/core/physics/transports/merged_containers.d.ts +26 -0
- package/build/core/physics/transports/merged_containers.d.ts.map +1 -0
- package/build/core/physics/transports/merged_containers.js +45 -0
- package/build/core/physics/transports/tare/bitrem_axle_splitter.d.ts +26 -0
- package/build/core/physics/transports/tare/bitrem_axle_splitter.d.ts.map +1 -0
- package/build/core/physics/transports/tare/bitrem_axle_splitter.js +84 -0
- package/build/core/physics/transports/tare/bitrem_axle_weight_split.d.ts +22 -0
- package/build/core/physics/transports/tare/bitrem_axle_weight_split.d.ts.map +1 -0
- package/build/core/physics/transports/tare/bitrem_axle_weight_split.js +32 -0
- package/build/core/physics/transports/transport.d.ts +33 -0
- package/build/core/physics/transports/transport.d.ts.map +1 -0
- package/build/core/physics/transports/transport.js +110 -0
- package/build/index.d.ts +8 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +10 -0
- package/eslint.config.js +51 -0
- package/package.json +38 -0
- package/src/core/contracts/chassi_reference.ts +7 -0
- package/src/core/contracts/ms_faixas_contract.ts +114 -0
- package/src/core/contracts/rotation_enum.ts +11 -0
- package/src/core/contracts/suspension_type.ts +4 -0
- package/src/core/contracts/transport_record.ts +4 -0
- package/src/core/contracts/vehicle_type.ts +12 -0
- package/src/core/contracts/vehicle_version.ts +7 -0
- package/src/core/contracts/wire_flags.ts +26 -0
- package/src/core/math/float_tools.ts +17 -0
- package/src/core/math/gaussian_elimination.ts +104 -0
- package/src/core/orchestration/axle_weight_physics.ts +37 -0
- package/src/core/orchestration/collision_checker.ts +86 -0
- package/src/core/orchestration/connector_payload_builder.ts +81 -0
- package/src/core/orchestration/java_mass_center.ts +98 -0
- package/src/core/orchestration/output_builder.ts +18 -0
- package/src/core/orchestration/request_schema.ts +26 -0
- package/src/core/orchestration/weight_by_axis_task.ts +140 -0
- package/src/core/physics/items/allocated_item.ts +41 -0
- package/src/core/physics/items/allocated_item_manager.ts +50 -0
- package/src/core/physics/items/center_of_mass.ts +31 -0
- package/src/core/physics/items/compute_grouper_center_of_mass.ts +44 -0
- package/src/core/physics/items/item_templates.ts +65 -0
- package/src/core/physics/items/multi_container_allocated_items.ts +120 -0
- package/src/core/physics/items/rotation_transforms.ts +29 -0
- package/src/core/physics/models/axle_weight_model.ts +109 -0
- package/src/core/physics/models/bi_truck_model.ts +74 -0
- package/src/core/physics/models/bi_truck_tractor_semi_trailer_model.ts +86 -0
- package/src/core/physics/models/bitrem_model.ts +148 -0
- package/src/core/physics/models/chassi_forces.ts +50 -0
- package/src/core/physics/models/deflection/beam_deflection.ts +105 -0
- package/src/core/physics/models/deflection/bitrem_deflection.ts +68 -0
- package/src/core/physics/models/deflection/create_deflection_delegate.ts +46 -0
- package/src/core/physics/models/deflection/deflection_model.ts +33 -0
- package/src/core/physics/models/deflection/deflection_support_manager.ts +56 -0
- package/src/core/physics/models/deflection/deflection_tools.ts +11 -0
- package/src/core/physics/models/deflection/integration_constant_calculator.ts +62 -0
- package/src/core/physics/models/deflection/rodotrem_deflection.ts +57 -0
- package/src/core/physics/models/deflection/semi_reboque_deflection.ts +40 -0
- package/src/core/physics/models/deflection/simple_truck_deflection.ts +35 -0
- package/src/core/physics/models/deflection/vanderleia_deflection.ts +48 -0
- package/src/core/physics/models/old_tare_model.ts +51 -0
- package/src/core/physics/models/old_tare_scale.ts +9 -0
- package/src/core/physics/models/old_tare_semireboque.ts +51 -0
- package/src/core/physics/models/old_tare_truck.ts +15 -0
- package/src/core/physics/models/old_tare_vanderleia.ts +44 -0
- package/src/core/physics/models/percentage_on_axles_calculator.ts +49 -0
- package/src/core/physics/models/quad_semi_trailer_model.ts +87 -0
- package/src/core/physics/models/rodotrem_model.ts +131 -0
- package/src/core/physics/models/semi_reboque_base.ts +103 -0
- package/src/core/physics/models/semi_reboque_model.ts +127 -0
- package/src/core/physics/models/simple_truck_base.ts +70 -0
- package/src/core/physics/models/simple_truck_model.ts +115 -0
- package/src/core/physics/models/single_container_tare.ts +56 -0
- package/src/core/physics/models/tare_model.ts +46 -0
- package/src/core/physics/models/vanderleia_model.ts +125 -0
- package/src/core/physics/services/axle_weight_output_builder.ts +63 -0
- package/src/core/physics/services/axle_weight_service.ts +116 -0
- package/src/core/physics/services/cm_axle_weight_service.ts +45 -0
- package/src/core/physics/services/container_corner_forces.ts +95 -0
- package/src/core/physics/transports/axle_manager.ts +45 -0
- package/src/core/physics/transports/axle_record.ts +68 -0
- package/src/core/physics/transports/chassi.ts +130 -0
- package/src/core/physics/transports/container_record.ts +58 -0
- package/src/core/physics/transports/containerweight/container_max_weight_calculator.ts +59 -0
- package/src/core/physics/transports/containerweight/container_tare_calculator.ts +76 -0
- package/src/core/physics/transports/containerweight/container_weight_model.ts +38 -0
- package/src/core/physics/transports/containerweight/merged_containers_weight_calculator.ts +39 -0
- package/src/core/physics/transports/containerweight/single_container_weight_calculator.ts +65 -0
- package/src/core/physics/transports/grouped_containers.ts +91 -0
- package/src/core/physics/transports/merged_containers.ts +62 -0
- package/src/core/physics/transports/tare/bitrem_axle_splitter.ts +107 -0
- package/src/core/physics/transports/tare/bitrem_axle_weight_split.ts +55 -0
- package/src/core/physics/transports/transport.ts +137 -0
- package/src/index.ts +12 -0
- package/src/service/.gitkeep +0 -0
- package/test/data/src/core/orchestration/weight_by_axis/case_1_basic_truck_input.json +1759 -0
- package/test/data/src/core/orchestration/weight_by_axis/case_2_vanderleia_input.json +1286 -0
- package/test/data/src/core/orchestration/weight_by_axis/case_3_interlink_input.json +2226 -0
- package/test/data/src/core/orchestration/weight_by_axis/case_4_quad_semi_trailer.json +639 -0
- package/test/data/src/core/orchestration/weight_by_axis/case_5_custom_center_of_gravity.json +557 -0
- package/test/data/src/core/physics/axle_weight_calculations/case_2_bitruck.json +664 -0
- package/test/data/src/core/physics/axle_weight_calculations/case_4_quad_semi_trailer.json +674 -0
- package/test/data/src/core/physics/axle_weight_calculations/case_5_bi_truck_semi_trailer.json +674 -0
- package/test/data/src/core/physics/axle_weight_service/case_1_input_truck.json +1025 -0
- package/test/data/src/core/physics/axle_weight_service/case_1_output_truck.json +38 -0
- package/test/data/src/core/physics/axle_weight_service/case_2_vanderleia_input.json +1286 -0
- package/test/data/src/core/physics/axle_weight_service/case_2_vanderleia_output.json +65 -0
- package/test/data/src/core/physics/axle_weight_service/case_3_input_semireboque.json +24625 -0
- package/test/data/src/core/physics/axle_weight_service/case_3_output_semireboque.json +57 -0
- package/test/data/src/core/physics/axle_weight_service/case_4_input_bitrem.json +2226 -0
- package/test/data/src/core/physics/axle_weight_service/case_4_output_bitrem.json +96 -0
- package/test/data/src/core/physics/beam_deflection/case_10_rodotrem_offset.json +474 -0
- package/test/data/src/core/physics/beam_deflection/case_11_bitruck.json +664 -0
- package/test/data/src/core/physics/beam_deflection/case_12_quad_semi_trailer.json +792 -0
- package/test/data/src/core/physics/beam_deflection/case_13_bi_truck_semi_trailer.json +792 -0
- package/test/data/src/core/physics/beam_deflection/case_1_documentation.ipynb +316 -0
- package/test/data/src/core/physics/beam_deflection/case_1_semireboque.json +402 -0
- package/test/data/src/core/physics/beam_deflection/case_2_bitrem.json +434 -0
- package/test/data/src/core/physics/beam_deflection/case_3_rodotrem.json +474 -0
- package/test/data/src/core/physics/beam_deflection/case_4_vanderleia_pneumatica.json +425 -0
- package/test/data/src/core/physics/beam_deflection/case_5_vanderleia_mecanica.json +366 -0
- package/test/data/src/core/physics/beam_deflection/case_6_truck.json +279 -0
- package/test/data/src/core/physics/beam_deflection/case_7_semireboque_structural_offset.json +318 -0
- package/test/data/src/core/physics/beam_deflection/case_8_vanderleia_offset.json +425 -0
- package/test/data/src/core/physics/beam_deflection/case_9_bitrem_offset.json +434 -0
- package/test/data/src/core/physics/bitrem_axle_splitter/case_1_simple_bitrem.json +145 -0
- package/test/data/src/core/physics/bitrem_axle_splitter/case_2_lowered_bitrem.json +238 -0
- package/test/data/src/core/physics/bitrem_axle_splitter/case_3_lowered_positive_proportion.json +238 -0
- package/test/data/src/core/physics/c_m_axle_weight_service/case_1_interlink_trailer.json +94 -0
- package/test/data/src/core/physics/calculations/case_1_simple_truck.json +83 -0
- package/test/data/src/core/physics/calculations/case_2_lowered_bitrem.json +1051 -0
- package/test/data/src/core/physics/calculations/case_3_container_mercedes.json +50 -0
- package/test/data/src/core/physics/container_corner_forces/case_1.json +674 -0
- package/test/data/src/core/physics/container_weight/case_1_basictruck.json +223 -0
- package/test/data/src/core/physics/container_weight/case_2_roadtrain.json +277 -0
- package/test/data/src/core/physics/container_weight/case_3_semireboque_rebaixado.json +197 -0
- package/test/data/src/core/physics/container_weight/case_4_semireboque_neck_limit.json +197 -0
- package/test/data/src/core/physics/container_weight/case_5_vanderleia_rebaixada.json +211 -0
- package/test/data/src/core/physics/container_weight/case_6_lowered_interlink.json +230 -0
- package/test/data/src/core/physics/python_goldens.json +9 -0
- package/test/data/src/core/physics/tare/case_1_simple_vanderleia.json +185 -0
- package/test/data/src/core/physics/tare/case_2_lowered_vanderleia.json +646 -0
- package/test/data/src/core/physics/tare/case_3_lowered_interlink.json +230 -0
- package/test/data/src/core/physics/tare/case_4_negative_tare_VUC.json +483 -0
- package/test/data/src/core/physics/tare/case_5_truck_bitruck.json +664 -0
- package/test/data/src/core/physics/tare/case_6_quad_semi_trailer.json +203 -0
- package/test/data/src/core/physics/tare/case_7_bi_truck_semi_trailer.json +203 -0
- package/test/data/src/core/physics/tare/case_8_triaxle_semi_trailer.json +203 -0
- package/test/data/src/core/physics/time_performance/case_1_center_of_mass.json +2916 -0
- package/test/data/src/core/physics/trucks/bitrem.json +150 -0
- package/test/data/src/core/physics/trucks/lowered_bitrem.json +1216 -0
- package/test/data/src/core/physics/trucks/lowered_bitrem_empty_first_container.json +1182 -0
- package/test/data/src/core/physics/trucks/rodotrem.json +148 -0
- package/test/data/src/core/physics/trucks/semi_reboque.json +91 -0
- package/test/data/src/core/physics/trucks/semi_reboque_rebaixado.json +1629 -0
- package/test/data/src/core/physics/trucks/simple_truck.json +85 -0
- package/test/data/src/core/physics/trucks/vanderleia_mechanical.json +105 -0
- package/test/data/src/core/physics/trucks/vanderleia_pneumatic.json +105 -0
- package/test/src/core/orchestration/request_schema.test.ts +20 -0
- package/test/src/core/orchestration/weight_by_axis_task.test.ts +87 -0
- package/test/src/core/physics/items/center_of_mass.test.ts +38 -0
- package/test/src/core/physics/items/multi_container_allocated_items.test.ts +22 -0
- package/test/src/core/physics/math_input_helpers.ts +64 -0
- package/test/src/core/physics/models/bitrem_model.test.ts +54 -0
- package/test/src/core/physics/models/deflection/deflection_model.test.ts +78 -0
- package/test/src/core/physics/models/rodotrem_model.test.ts +29 -0
- package/test/src/core/physics/models/semi_reboque_model.test.ts +72 -0
- package/test/src/core/physics/models/simple_truck_model.test.ts +23 -0
- package/test/src/core/physics/models/tare_model.test.ts +34 -0
- package/test/src/core/physics/models/vanderleia_model.test.ts +36 -0
- package/test/src/core/physics/services/axle_weight_service.test.ts +56 -0
- package/test/src/core/physics/services/cm_axle_weight_service.test.ts +23 -0
- package/test/src/core/physics/services/container_corner_forces.test.ts +23 -0
- package/test/src/core/physics/test_helpers.ts +13 -0
- package/test/src/core/physics/transports/chassi.test.ts +35 -0
- package/test/src/core/physics/transports/containerweight/container_weight_model.test.ts +57 -0
- package/test/src/core/physics/transports/tare/bitrem_axle_splitter.test.ts +30 -0
- package/test/src/index.test.ts +35 -0
- package/tsconfig.eslint.json +15 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import type { Transport } from '../transports/transport.js'
|
|
2
|
+
import { MergedContainers } from '../transports/merged_containers.js'
|
|
3
|
+
import type { MultiContainerAllocatedItems } from '../items/multi_container_allocated_items.js'
|
|
4
|
+
import {
|
|
5
|
+
calculate_chassi_forces_from_multi,
|
|
6
|
+
compute_center_of_mass_by_grouper
|
|
7
|
+
} from '../items/compute_grouper_center_of_mass.js'
|
|
8
|
+
import { VEHICLE_VERSION } from '../../contracts/vehicle_version.js'
|
|
9
|
+
import { CenterOfMass } from '../items/center_of_mass.js'
|
|
10
|
+
import { ChassiForces } from './chassi_forces.js'
|
|
11
|
+
import { SimpleTruckBase } from './simple_truck_base.js'
|
|
12
|
+
import { BiTruckModel } from './bi_truck_model.js'
|
|
13
|
+
|
|
14
|
+
type TruckDelegate = {
|
|
15
|
+
calculate_chassi_forces_with_load_center_of_mass: (
|
|
16
|
+
center_of_mass_by_grouper: Record<number, CenterOfMass>
|
|
17
|
+
) => ChassiForces
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Caminhão / VUC axle weight (optional bitruck variant).
|
|
22
|
+
*/
|
|
23
|
+
export class SimpleTruckModel
|
|
24
|
+
{
|
|
25
|
+
private readonly delegate: TruckDelegate & { axles_positions?: number[]; equivalent_truck?: SimpleTruckBase }
|
|
26
|
+
private readonly transport: Transport
|
|
27
|
+
private readonly merged_containers: MergedContainers
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @param transport - Parsed transport.
|
|
31
|
+
*/
|
|
32
|
+
constructor(transport: Transport)
|
|
33
|
+
{
|
|
34
|
+
this.transport = transport
|
|
35
|
+
this.merged_containers = new MergedContainers(transport)
|
|
36
|
+
if (transport.vehicle_version === VEHICLE_VERSION.CAMINHAO_BITRUCK)
|
|
37
|
+
{
|
|
38
|
+
this.delegate = new BiTruckModel(transport)
|
|
39
|
+
}
|
|
40
|
+
else
|
|
41
|
+
{
|
|
42
|
+
const base = new SimpleTruckBase(transport)
|
|
43
|
+
base.set_axles_positions()
|
|
44
|
+
this.delegate = base
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @param multi_items - Allocated items.
|
|
50
|
+
* @returns Loaded weights per axle.
|
|
51
|
+
*/
|
|
52
|
+
calculate_weight_on_axles(multi_items: MultiContainerAllocatedItems): number[]
|
|
53
|
+
{
|
|
54
|
+
const forces = this.calculate_chassi_forces(multi_items)
|
|
55
|
+
return forces.list_axles_indexes().map((index) => forces.get_force_on_axle(index))
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @param multi_items - Allocated items.
|
|
60
|
+
* @returns Chassis forces.
|
|
61
|
+
*/
|
|
62
|
+
calculate_chassi_forces(multi_items: MultiContainerAllocatedItems): ChassiForces
|
|
63
|
+
{
|
|
64
|
+
return calculate_chassi_forces_from_multi(
|
|
65
|
+
this.transport,
|
|
66
|
+
multi_items,
|
|
67
|
+
(center_of_mass_by_grouper) =>
|
|
68
|
+
this.calculate_chassi_forces_with_load_center_of_mass(center_of_mass_by_grouper))
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @param multi_items - Allocated items.
|
|
73
|
+
* @returns Deflection support pairs.
|
|
74
|
+
*/
|
|
75
|
+
calculate_support_data(multi_items: MultiContainerAllocatedItems): [number, number][]
|
|
76
|
+
{
|
|
77
|
+
if (this.transport.vehicle_version === VEHICLE_VERSION.CAMINHAO_BITRUCK)
|
|
78
|
+
{
|
|
79
|
+
const center_of_mass_by_grouper = compute_center_of_mass_by_grouper(
|
|
80
|
+
multi_items,
|
|
81
|
+
this.merged_containers)
|
|
82
|
+
const bi_truck = this.delegate as BiTruckModel
|
|
83
|
+
const forces = bi_truck.equivalent_truck
|
|
84
|
+
.calculate_chassi_forces_with_load_center_of_mass(center_of_mass_by_grouper)
|
|
85
|
+
const positions = bi_truck.equivalent_truck.axles_positions
|
|
86
|
+
return [[positions[0], forces.get_force_on_axle(0)], [positions[1], forces.get_force_on_axle(1)]]
|
|
87
|
+
}
|
|
88
|
+
const forces = this.calculate_chassi_forces(multi_items)
|
|
89
|
+
const base = this.delegate as SimpleTruckBase
|
|
90
|
+
return [
|
|
91
|
+
[base.axles_positions[0], forces.get_force_on_axle(0)],
|
|
92
|
+
[base.axles_positions[1], forces.get_force_on_axle(1)]
|
|
93
|
+
]
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @returns Merged grouper 1 length.
|
|
98
|
+
*/
|
|
99
|
+
calculate_container_length(): number
|
|
100
|
+
{
|
|
101
|
+
return this.merged_containers.get_container_by_grouper_index(1).length
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* @param center_of_mass_by_grouper - CM per grouper.
|
|
106
|
+
* @returns Chassis forces.
|
|
107
|
+
*/
|
|
108
|
+
calculate_chassi_forces_with_load_center_of_mass(
|
|
109
|
+
center_of_mass_by_grouper: Record<number, CenterOfMass>
|
|
110
|
+
): ChassiForces
|
|
111
|
+
{
|
|
112
|
+
return this.delegate.calculate_chassi_forces_with_load_center_of_mass(
|
|
113
|
+
center_of_mass_by_grouper)
|
|
114
|
+
}
|
|
115
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { CenterOfMass } from '../items/center_of_mass.js'
|
|
2
|
+
import { AxleWeightModel } from './axle_weight_model.js'
|
|
3
|
+
import type { Transport } from '../transports/transport.js'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Physics-based tare from uniform load at volume centroid.
|
|
7
|
+
*/
|
|
8
|
+
export class SingleContainerTare
|
|
9
|
+
{
|
|
10
|
+
/**
|
|
11
|
+
* @param transport - Parsed transport.
|
|
12
|
+
*/
|
|
13
|
+
constructor(private readonly transport: Transport)
|
|
14
|
+
{}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @returns Calculated tare per axle.
|
|
18
|
+
*/
|
|
19
|
+
calculate(): number[]
|
|
20
|
+
{
|
|
21
|
+
const forces = this.calculate_forces_on_axles(
|
|
22
|
+
this.calculate_z_centroid(),
|
|
23
|
+
this.transport.supported_weight)
|
|
24
|
+
return this.transport.axle_manager.list_axles_indexes().map((index) =>
|
|
25
|
+
{
|
|
26
|
+
const axle = this.transport.axle_manager.get_axle(index)
|
|
27
|
+
return axle.max_supported_weight - forces.get_force_on_axle(index)
|
|
28
|
+
})
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
private calculate_z_centroid(): number
|
|
32
|
+
{
|
|
33
|
+
let z_offset = 0
|
|
34
|
+
let sum_z = 0
|
|
35
|
+
let total_volume = 0
|
|
36
|
+
for (const sequence of this.transport.list_containers_sequence_indexes())
|
|
37
|
+
{
|
|
38
|
+
const container = this.transport.get_container_by_sequence_index(sequence)
|
|
39
|
+
const z_centroid = z_offset + container.length / 2
|
|
40
|
+
z_offset += container.length
|
|
41
|
+
const volume = container.volume()
|
|
42
|
+
sum_z += z_centroid * volume
|
|
43
|
+
total_volume += volume
|
|
44
|
+
}
|
|
45
|
+
return sum_z / total_volume
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
private calculate_forces_on_axles(z_position: number, mass: number)
|
|
49
|
+
{
|
|
50
|
+
const model = new AxleWeightModel(this.transport)
|
|
51
|
+
const center_of_mass = new CenterOfMass()
|
|
52
|
+
center_of_mass.z = z_position
|
|
53
|
+
center_of_mass.mass = mass
|
|
54
|
+
return model.calculate_chassi_forces_with_load_center_of_mass({ 1: center_of_mass })
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { VEHICLE_TYPE } from '../../contracts/vehicle_type.js'
|
|
2
|
+
import type { Transport } from '../transports/transport.js'
|
|
3
|
+
import { OldTareModel } from './old_tare_model.js'
|
|
4
|
+
import { SingleContainerTare } from './single_container_tare.js'
|
|
5
|
+
|
|
6
|
+
const DISTANCE_TOLERANCE = 0.9
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Selects legacy or physics tare model per axle.
|
|
10
|
+
*/
|
|
11
|
+
export class TareModel
|
|
12
|
+
{
|
|
13
|
+
/**
|
|
14
|
+
* @param transport - Parsed transport.
|
|
15
|
+
* @returns Tare per axle.
|
|
16
|
+
*/
|
|
17
|
+
calculate(transport: Transport): number[]
|
|
18
|
+
{
|
|
19
|
+
if (transport.vehicle_type === VEHICLE_TYPE.BITREM
|
|
20
|
+
|| transport.vehicle_type === VEHICLE_TYPE.RODOTREM)
|
|
21
|
+
{
|
|
22
|
+
return new OldTareModel().calculate(transport)
|
|
23
|
+
}
|
|
24
|
+
const reference = new OldTareModel().calculate(transport)
|
|
25
|
+
const physics = new SingleContainerTare(transport).calculate()
|
|
26
|
+
return choose_tare_model(reference, physics)
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @param reference_values - Legacy tare per axle.
|
|
32
|
+
* @param new_values - Physics tare per axle.
|
|
33
|
+
* @returns Selected tare list.
|
|
34
|
+
*/
|
|
35
|
+
function choose_tare_model(reference_values: number[], new_values: number[]): number[]
|
|
36
|
+
{
|
|
37
|
+
for (let index = 0; index < reference_values.length; index++)
|
|
38
|
+
{
|
|
39
|
+
const ref = reference_values[index]
|
|
40
|
+
if (Math.abs(new_values[index] - ref) > ref * DISTANCE_TOLERANCE)
|
|
41
|
+
{
|
|
42
|
+
return reference_values
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return new_values
|
|
46
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import type { Transport } from '../transports/transport.js'
|
|
2
|
+
import type { MultiContainerAllocatedItems } from '../items/multi_container_allocated_items.js'
|
|
3
|
+
import { calculate_chassi_forces_from_multi } from '../items/compute_grouper_center_of_mass.js'
|
|
4
|
+
import { Chassi } from '../transports/chassi.js'
|
|
5
|
+
import { CHASSI_REFERENCE } from '../../contracts/chassi_reference.js'
|
|
6
|
+
import { SUSPENSION_TYPE } from '../../contracts/suspension_type.js'
|
|
7
|
+
import { CenterOfMass } from '../items/center_of_mass.js'
|
|
8
|
+
import { ChassiForces } from './chassi_forces.js'
|
|
9
|
+
import { solve_linear_system } from '../../math/gaussian_elimination.js'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Vanderleia five-axle static model with suspension-dependent coupling.
|
|
13
|
+
*/
|
|
14
|
+
export class VanderleiaModel
|
|
15
|
+
{
|
|
16
|
+
readonly chassi: Chassi
|
|
17
|
+
private readonly matrix: number[][]
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @param transport - Parsed transport.
|
|
21
|
+
*/
|
|
22
|
+
constructor(private readonly transport: Transport)
|
|
23
|
+
{
|
|
24
|
+
this.chassi = new Chassi(transport)
|
|
25
|
+
this.matrix = generate_vanderleia_matrix(this.chassi, transport)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @param multi_items - Allocated items.
|
|
30
|
+
* @returns Loaded weights per axle.
|
|
31
|
+
*/
|
|
32
|
+
calculate_weight_on_axles(multi_items: MultiContainerAllocatedItems): number[]
|
|
33
|
+
{
|
|
34
|
+
const forces = this.calculate_chassi_forces(multi_items)
|
|
35
|
+
return forces.list_axles_indexes().map((index) => forces.get_force_on_axle(index))
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @param multi_items - Allocated items.
|
|
40
|
+
* @returns Chassis forces.
|
|
41
|
+
*/
|
|
42
|
+
calculate_chassi_forces(multi_items: MultiContainerAllocatedItems): ChassiForces
|
|
43
|
+
{
|
|
44
|
+
return calculate_chassi_forces_from_multi(
|
|
45
|
+
this.transport,
|
|
46
|
+
multi_items,
|
|
47
|
+
(center_of_mass_by_grouper) =>
|
|
48
|
+
this.calculate_chassi_forces_with_load_center_of_mass(center_of_mass_by_grouper))
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* @param center_of_mass_by_grouper - CM for grouper 1.
|
|
53
|
+
* @returns Chassis forces on five axles.
|
|
54
|
+
*/
|
|
55
|
+
calculate_chassi_forces_with_load_center_of_mass(
|
|
56
|
+
center_of_mass_by_grouper: Record<number, CenterOfMass>
|
|
57
|
+
): ChassiForces
|
|
58
|
+
{
|
|
59
|
+
const solution = solve_vanderleia_system(this.matrix, center_of_mass_by_grouper[1])
|
|
60
|
+
const forces = new ChassiForces()
|
|
61
|
+
forces.add_pin_forces([solution[3]])
|
|
62
|
+
forces.add_axle_forces([
|
|
63
|
+
solution[5],
|
|
64
|
+
solution[4],
|
|
65
|
+
solution[2],
|
|
66
|
+
solution[1],
|
|
67
|
+
solution[0]
|
|
68
|
+
])
|
|
69
|
+
return forces
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* @param chassi - Chassis geometry.
|
|
75
|
+
* @param transport - Parsed transport (suspension type).
|
|
76
|
+
* @returns 6×6 matrix.
|
|
77
|
+
*/
|
|
78
|
+
function generate_vanderleia_matrix(chassi: Chassi, transport: Transport): number[][]
|
|
79
|
+
{
|
|
80
|
+
const tractor_pin = chassi.get_pin_position(0, CHASSI_REFERENCE.TRACTOR)
|
|
81
|
+
const tractor_axle_1 = chassi.get_axle_position(0, CHASSI_REFERENCE.TRACTOR)
|
|
82
|
+
const tractor_axle_2 = chassi.get_axle_position(1, CHASSI_REFERENCE.TRACTOR)
|
|
83
|
+
const pin_1 = chassi.get_pin_position(0, CHASSI_REFERENCE.GROUPER_1)
|
|
84
|
+
const axle_3 = chassi.get_axle_position(2, CHASSI_REFERENCE.GROUPER_1)
|
|
85
|
+
const axle_4 = chassi.get_axle_position(3, CHASSI_REFERENCE.GROUPER_1)
|
|
86
|
+
const axle_5 = chassi.get_axle_position(4, CHASSI_REFERENCE.GROUPER_1)
|
|
87
|
+
const relation = reactions_relation(transport)
|
|
88
|
+
return [
|
|
89
|
+
[1, 0, -relation[0], 0, 0, 0],
|
|
90
|
+
[0, 1, -relation[1], 0, 0, 0],
|
|
91
|
+
[1, 1, 1, 1, 0, 0],
|
|
92
|
+
[axle_5, axle_4, axle_3, pin_1, 0, 0],
|
|
93
|
+
[0, 0, 0, -1, 1, 1],
|
|
94
|
+
[0, 0, 0, -tractor_pin, tractor_axle_2, tractor_axle_1]
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* @param transport - Parsed transport.
|
|
100
|
+
* @returns Reaction coupling factors.
|
|
101
|
+
*/
|
|
102
|
+
function reactions_relation(transport: Transport): [number, number]
|
|
103
|
+
{
|
|
104
|
+
const raw = transport.suspension_type
|
|
105
|
+
if (raw === SUSPENSION_TYPE.PNEUMATICA || raw === 'Pneumatica')
|
|
106
|
+
{
|
|
107
|
+
return [1, 1]
|
|
108
|
+
}
|
|
109
|
+
if (raw === SUSPENSION_TYPE.MECANICA || raw === 'Mecanica')
|
|
110
|
+
{
|
|
111
|
+
return [0.867469880, 0.542168675]
|
|
112
|
+
}
|
|
113
|
+
throw new Error(`Unrecognized suspension type: ${String(raw)}`)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* @param matrix - System matrix.
|
|
118
|
+
* @param center_of_mass - Load CM.
|
|
119
|
+
* @returns Solution vector.
|
|
120
|
+
*/
|
|
121
|
+
function solve_vanderleia_system(matrix: number[][], center_of_mass: CenterOfMass): number[]
|
|
122
|
+
{
|
|
123
|
+
const independent = [0, 0, center_of_mass.mass, center_of_mass.mass * center_of_mass.z, 0, 0]
|
|
124
|
+
return solve_linear_system(matrix, independent)
|
|
125
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { VEHICLE_TYPE } from '../../contracts/vehicle_type.js'
|
|
2
|
+
import { CHASSI_REFERENCE } from '../../contracts/chassi_reference.js'
|
|
3
|
+
import type { Transport } from '../transports/transport.js'
|
|
4
|
+
import type { Chassi } from '../transports/chassi.js'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @param transport - Parsed transport.
|
|
8
|
+
* @param grouper - Grouper index.
|
|
9
|
+
* @returns Axle indexes for grouper output.
|
|
10
|
+
*/
|
|
11
|
+
export function select_axles_for_grouper(transport: Transport, grouper: number): number[]
|
|
12
|
+
{
|
|
13
|
+
const type = transport.vehicle_type
|
|
14
|
+
if (type === VEHICLE_TYPE.RODOTREM || type === VEHICLE_TYPE.BITREM)
|
|
15
|
+
{
|
|
16
|
+
return grouper === 1 ? [0, 1, 2] : [3, 4]
|
|
17
|
+
}
|
|
18
|
+
return transport.axle_manager.list_axles_indexes()
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @param axles_indexes - Axle indexes in output row.
|
|
23
|
+
* @returns Chassi reference for distance helper.
|
|
24
|
+
*/
|
|
25
|
+
export function find_grouper_reference(
|
|
26
|
+
axles_indexes: number[]
|
|
27
|
+
): typeof CHASSI_REFERENCE.GROUPER_1 | typeof CHASSI_REFERENCE.GROUPER_2
|
|
28
|
+
{
|
|
29
|
+
return axles_indexes.includes(0) ? CHASSI_REFERENCE.GROUPER_1 : CHASSI_REFERENCE.GROUPER_2
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
type AxleWeightOutputInput = {
|
|
33
|
+
transport: Transport
|
|
34
|
+
chassi: Chassi
|
|
35
|
+
axles_indexes: number[]
|
|
36
|
+
weight_on_axles: number[]
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @param input - Transport, chassi, axles, and cargo loads.
|
|
41
|
+
* @returns pesoEixos wire rows.
|
|
42
|
+
*/
|
|
43
|
+
export function build_axle_weights_output(input: AxleWeightOutputInput): Record<string, unknown>[]
|
|
44
|
+
{
|
|
45
|
+
return input.axles_indexes.map((axle_index) =>
|
|
46
|
+
{
|
|
47
|
+
const axle = input.transport.axle_manager.get_axle(axle_index)
|
|
48
|
+
const cargo = input.weight_on_axles[axle_index]
|
|
49
|
+
return {
|
|
50
|
+
distanciaOrigem: axle.distance_from_previous_axle,
|
|
51
|
+
pesoMaxFinal: axle.max_supported_weight,
|
|
52
|
+
tara: axle.tare,
|
|
53
|
+
pesoMax: axle.max_supported_weight - axle.tare,
|
|
54
|
+
pesoCarregado: cargo,
|
|
55
|
+
pesoCarregadoFinal: axle.tare + cargo,
|
|
56
|
+
distanciaOrigemSemPrimeiroEixo: axle_index === 0
|
|
57
|
+
? 0
|
|
58
|
+
: input.chassi.get_axle_position(
|
|
59
|
+
axle_index,
|
|
60
|
+
find_grouper_reference(input.axles_indexes))
|
|
61
|
+
}
|
|
62
|
+
})
|
|
63
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { MsFaixasContract } from '../../contracts/ms_faixas_contract.js'
|
|
2
|
+
import { Transport } from '../transports/transport.js'
|
|
3
|
+
import { Chassi } from '../transports/chassi.js'
|
|
4
|
+
import { MergedContainers } from '../transports/merged_containers.js'
|
|
5
|
+
import { AxleWeightModel } from '../models/axle_weight_model.js'
|
|
6
|
+
import {
|
|
7
|
+
build_axle_weights_output,
|
|
8
|
+
select_axles_for_grouper
|
|
9
|
+
} from './axle_weight_output_builder.js'
|
|
10
|
+
|
|
11
|
+
const TRANSPORT_LIST_FLAG = 'envs'
|
|
12
|
+
const TRANSPORT_ID_FLAG = 'idCaminhao'
|
|
13
|
+
const CONTAINERS_FLAG = 'conteiners'
|
|
14
|
+
const SEQUENCE_FLAG = 'sequencia'
|
|
15
|
+
const FAIXAS_FLAG = 'faixas'
|
|
16
|
+
const TARE_FLAG = 'tara'
|
|
17
|
+
const ITEMS_FLAG = 'items'
|
|
18
|
+
const MAX_SUPPORTED_FLAG = 'pesoSuportado'
|
|
19
|
+
const CENTER_OF_GRAVITY_FLAG = 'centroGravidade'
|
|
20
|
+
const AXLE_WEIGHTS_FLAG = 'pesoEixos'
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Full ms-faixas axle weight pipeline (Python AxleWeightService port).
|
|
24
|
+
*/
|
|
25
|
+
export class AxleWeightService
|
|
26
|
+
{
|
|
27
|
+
private readonly transport: Transport
|
|
28
|
+
private readonly chassi: Chassi
|
|
29
|
+
private readonly allocated_by_sequence: Record<number, import('../items/allocated_item_manager.js').AllocatedItemManager>
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @param input_data - Ms-faixas payload with envs.
|
|
33
|
+
*/
|
|
34
|
+
constructor(input_data: Record<string, unknown>)
|
|
35
|
+
{
|
|
36
|
+
const contract = new MsFaixasContract(input_data)
|
|
37
|
+
this.transport = new Transport(contract.transport_data)
|
|
38
|
+
this.chassi = new Chassi(this.transport)
|
|
39
|
+
this.allocated_by_sequence = contract.allocated_items_by_sequence_id
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @returns Math output with envs and pesoEixos per container.
|
|
44
|
+
*/
|
|
45
|
+
run(): Record<string, unknown>
|
|
46
|
+
{
|
|
47
|
+
return {
|
|
48
|
+
[TRANSPORT_LIST_FLAG]: [{
|
|
49
|
+
[TRANSPORT_ID_FLAG]: this.transport.id,
|
|
50
|
+
[CONTAINERS_FLAG]: this.build_containers_data()
|
|
51
|
+
}]
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
private build_containers_data(): Record<string, unknown>[]
|
|
56
|
+
{
|
|
57
|
+
const weights_by_sequence = this.evaluate_weight_on_axles()
|
|
58
|
+
const center_of_gravity: Record<number, number> = {}
|
|
59
|
+
for (const sequence of this.transport.list_containers_sequence_indexes())
|
|
60
|
+
{
|
|
61
|
+
center_of_gravity[sequence] = 0
|
|
62
|
+
}
|
|
63
|
+
return this.transport.list_containers_sequence_indexes().map((sequence) =>
|
|
64
|
+
{
|
|
65
|
+
const container = this.transport.get_container_by_sequence_index(sequence)
|
|
66
|
+
return {
|
|
67
|
+
[SEQUENCE_FLAG]: container.sequence_index,
|
|
68
|
+
[FAIXAS_FLAG]: [],
|
|
69
|
+
[TARE_FLAG]: 0,
|
|
70
|
+
[ITEMS_FLAG]: [],
|
|
71
|
+
[MAX_SUPPORTED_FLAG]: container.max_supported_weight,
|
|
72
|
+
[CENTER_OF_GRAVITY_FLAG]: center_of_gravity[sequence],
|
|
73
|
+
[AXLE_WEIGHTS_FLAG]: weights_by_sequence[sequence] ?? []
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
private evaluate_weight_on_axles(): Record<number, Record<string, unknown>[]>
|
|
79
|
+
{
|
|
80
|
+
const model = new AxleWeightModel(this.transport)
|
|
81
|
+
const weight_on_axles = model.calculate_weight_on_axles(this.allocated_by_sequence)
|
|
82
|
+
const merged = new MergedContainers(this.transport)
|
|
83
|
+
const result: Record<number, Record<string, unknown>[]> = {}
|
|
84
|
+
for (const grouper of merged.list_grouper_indexes())
|
|
85
|
+
{
|
|
86
|
+
this.assign_grouper_axle_outputs({
|
|
87
|
+
grouper,
|
|
88
|
+
grouped: merged.get_container_by_grouper_index(grouper),
|
|
89
|
+
weight_on_axles,
|
|
90
|
+
result
|
|
91
|
+
})
|
|
92
|
+
}
|
|
93
|
+
return result
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
private assign_grouper_axle_outputs(input: {
|
|
97
|
+
grouper: number
|
|
98
|
+
grouped: import('../transports/grouped_containers.js').GroupedContainers
|
|
99
|
+
weight_on_axles: number[]
|
|
100
|
+
result: Record<number, Record<string, unknown>[]>
|
|
101
|
+
}): void
|
|
102
|
+
{
|
|
103
|
+
const sequences = input.grouped.list_containers_sequence_indexes()
|
|
104
|
+
const axles = select_axles_for_grouper(this.transport, input.grouper)
|
|
105
|
+
input.result[sequences[0]] = build_axle_weights_output({
|
|
106
|
+
transport: this.transport,
|
|
107
|
+
chassi: this.chassi,
|
|
108
|
+
axles_indexes: axles,
|
|
109
|
+
weight_on_axles: input.weight_on_axles
|
|
110
|
+
})
|
|
111
|
+
for (let index = 1; index < sequences.length; index++)
|
|
112
|
+
{
|
|
113
|
+
input.result[sequences[index]] = []
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { WIRE_FLAGS } from '../../contracts/wire_flags.js'
|
|
2
|
+
import type { TransportRecord } from '../../contracts/transport_record.js'
|
|
3
|
+
import { CenterOfMass } from '../items/center_of_mass.js'
|
|
4
|
+
import { AxleWeightModel } from '../models/axle_weight_model.js'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Center-of-mass-driven axle weight service (port of CMAxleWeightService).
|
|
8
|
+
*/
|
|
9
|
+
export class CmAxleWeightService
|
|
10
|
+
{
|
|
11
|
+
/**
|
|
12
|
+
* @param cm_axle_weight_data - Transport dict with center_of_mass map.
|
|
13
|
+
* @returns Loaded cargo weight per axle.
|
|
14
|
+
*/
|
|
15
|
+
calculate(cm_axle_weight_data: TransportRecord): number[]
|
|
16
|
+
{
|
|
17
|
+
const model = new AxleWeightModel(cm_axle_weight_data)
|
|
18
|
+
const center_of_mass_by_grouper = read_center_of_mass_map(
|
|
19
|
+
cm_axle_weight_data[WIRE_FLAGS.CM_SERVICE_CENTER_OF_MASS] as Record<string, unknown>)
|
|
20
|
+
const chassi_forces = model.calculate_chassi_forces_with_load_center_of_mass(
|
|
21
|
+
center_of_mass_by_grouper)
|
|
22
|
+
return chassi_forces.list_axles_indexes().map(
|
|
23
|
+
(index) => chassi_forces.get_force_on_axle(index))
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @param cm_data - Wire center_of_mass map.
|
|
29
|
+
* @returns Grouper id to CenterOfMass.
|
|
30
|
+
*/
|
|
31
|
+
function read_center_of_mass_map(
|
|
32
|
+
cm_data: Record<string, unknown>
|
|
33
|
+
): Record<number, CenterOfMass>
|
|
34
|
+
{
|
|
35
|
+
const result: Record<number, CenterOfMass> = {}
|
|
36
|
+
for (const grouper_key of Object.keys(cm_data))
|
|
37
|
+
{
|
|
38
|
+
const entry = cm_data[grouper_key] as Record<string, unknown>
|
|
39
|
+
const center_of_mass = new CenterOfMass()
|
|
40
|
+
center_of_mass.mass = Number(entry[WIRE_FLAGS.CM_SERVICE_MASS])
|
|
41
|
+
center_of_mass.z = Number(entry[WIRE_FLAGS.CM_SERVICE_Z])
|
|
42
|
+
result[Number(grouper_key)] = center_of_mass
|
|
43
|
+
}
|
|
44
|
+
return result
|
|
45
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Container corner force distribution (ISSUE-349).
|
|
3
|
+
*/
|
|
4
|
+
export class ContainerCornerForces
|
|
5
|
+
{
|
|
6
|
+
private readonly x_box_center: number[] = []
|
|
7
|
+
private readonly z_box_center: number[] = []
|
|
8
|
+
private readonly y_box_center: number[] = []
|
|
9
|
+
private readonly weight_box: number[] = []
|
|
10
|
+
private total_mass = 0
|
|
11
|
+
private x_cm = 0
|
|
12
|
+
private y_cm = 0
|
|
13
|
+
private z_cm = 0
|
|
14
|
+
private force_on_door: number | null = null
|
|
15
|
+
private force_on_right_corner_door = 0
|
|
16
|
+
private force_on_left_corner_door = 0
|
|
17
|
+
private force_on_end_wall = 0
|
|
18
|
+
private force_on_right_corner_end_wall = 0
|
|
19
|
+
private force_on_left_corner_end_wall = 0
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @param input_data - Items and container dimensions.
|
|
23
|
+
*/
|
|
24
|
+
constructor(private readonly input_data: Record<string, unknown>)
|
|
25
|
+
{
|
|
26
|
+
const items = input_data.items as Record<string, unknown>[]
|
|
27
|
+
for (const item of items)
|
|
28
|
+
{
|
|
29
|
+
this.x_box_center.push(Number(item.x) + 0.5 * Number(item.width))
|
|
30
|
+
this.z_box_center.push(Number(item.z) + 0.5 * Number(item.length))
|
|
31
|
+
this.y_box_center.push(Number(item.y) + 0.5 * Number(item.height))
|
|
32
|
+
this.weight_box.push(Number(item.weight))
|
|
33
|
+
}
|
|
34
|
+
this.total_mass = this.weight_box.reduce((sum, weight) => sum + weight, 0)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Computes center of gravity from item boxes. */
|
|
38
|
+
calculate_cm(): void
|
|
39
|
+
{
|
|
40
|
+
this.x_cm = dot(this.x_box_center, this.weight_box) / this.total_mass
|
|
41
|
+
this.z_cm = dot(this.z_box_center, this.weight_box) / this.total_mass
|
|
42
|
+
this.y_cm = dot(this.y_box_center, this.weight_box) / this.total_mass
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Computes corner reaction forces including container tare split. */
|
|
46
|
+
calculate_corner_forces(): void
|
|
47
|
+
{
|
|
48
|
+
const container = this.input_data.container as Record<string, unknown>
|
|
49
|
+
const container_length = Number(container.length)
|
|
50
|
+
const container_width = Number(container.width)
|
|
51
|
+
this.force_on_door = (this.z_cm * this.total_mass) / container_length
|
|
52
|
+
this.force_on_right_corner_door = (this.x_cm * this.force_on_door) / container_width
|
|
53
|
+
this.force_on_left_corner_door = this.force_on_door - this.force_on_right_corner_door
|
|
54
|
+
this.force_on_end_wall = this.total_mass - this.force_on_door
|
|
55
|
+
this.force_on_right_corner_end_wall = (this.x_cm * this.force_on_end_wall) / container_width
|
|
56
|
+
this.force_on_left_corner_end_wall = this.force_on_end_wall - this.force_on_right_corner_end_wall
|
|
57
|
+
const tare_quarter = 0.25 * Number(container.tare)
|
|
58
|
+
this.force_on_right_corner_door += tare_quarter
|
|
59
|
+
this.force_on_left_corner_door += tare_quarter
|
|
60
|
+
this.force_on_right_corner_end_wall += tare_quarter
|
|
61
|
+
this.force_on_left_corner_end_wall += tare_quarter
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @returns Response JSON.
|
|
66
|
+
*/
|
|
67
|
+
json(): Record<string, unknown>
|
|
68
|
+
{
|
|
69
|
+
const response: Record<string, unknown> = {
|
|
70
|
+
centerOfGravity: { x: this.x_cm, y: this.y_cm, z: this.z_cm }
|
|
71
|
+
}
|
|
72
|
+
if (this.force_on_door !== null)
|
|
73
|
+
{
|
|
74
|
+
response.corner_forces = {
|
|
75
|
+
force_on_door: this.force_on_door,
|
|
76
|
+
force_on_right_corner_door: this.force_on_right_corner_door,
|
|
77
|
+
force_on_left_corner_door: this.force_on_left_corner_door,
|
|
78
|
+
force_on_end_wall: this.force_on_end_wall,
|
|
79
|
+
force_on_right_corner_end_wall: this.force_on_right_corner_end_wall,
|
|
80
|
+
force_on_left_corner_end_wall: this.force_on_left_corner_end_wall
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return response
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* @param values - Value list.
|
|
89
|
+
* @param weights - Weight list.
|
|
90
|
+
* @returns Weighted sum.
|
|
91
|
+
*/
|
|
92
|
+
function dot(values: number[], weights: number[]): number
|
|
93
|
+
{
|
|
94
|
+
return values.reduce((sum, value, index) => sum + value * weights[index], 0)
|
|
95
|
+
}
|