Compare commits

...
2 Commits
Author SHA1 Message Date
hesuicong 4e8ba476f5 代码更新 2025-12-11 16:28:00 +08:00
hesuicong 4dffb90613 代码更新 2025-12-11 15:01:04 +08:00
15 changed files with 26 additions and 415 deletions

No files matched your search

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+5 -7
View File
@@ -172,11 +172,9 @@ def get_lowest_position_of_z_ext(mesh_obj):
vertices = np.asarray(pcd_transformed.vertices)
z_mean1 = np.mean(vertices[:, 2])
z_max1 = np.max(vertices[:, 2])
start_time_v1 = time.time()
volume_centroid = get_volume_centroid(pcd_transformed)
z_volume_center1 = volume_centroid[2]
delta = time.time() - start_time_v1
# print(f"get_volume_centroid time={delta}")
angle_rad = np.pi
#print("旋转前质心:", pcd_transformed.get_center())
@@ -489,14 +487,14 @@ def arrange_box_correctly(obj_transformed, voxel_size,total_matrix):
pcd.points = o3d.utility.Vector3dVector(vertices)
# 降采样与特征计算
pcd_downsampled = down_sample(pcd, voxel_size)
# pcd_downsampled = down_sample(pcd, voxel_size)
# points = np.asarray(pcd_downsampled.points)
points = np.asarray(pcd.points)
points = np.asarray(pcd_downsampled.points)
cov = np.cov(points.T)
center = obj_transformed.get_center()
# 特征分解与方向约束(关键修改点)
eigen_vals, eigen_vecs = np.linalg.eigh(cov)
max_axis = eigen_vecs[:, np.argmax(eigen_vals)]
@@ -732,7 +730,7 @@ class Platform:
else:
start_y = my + extend_dist_border_y_min
final_y = self.depth
print("final_y2", model['name'], start_y, final_y, my, extend_dist_border_y_max, px)
# print("final_y2", model['name'], start_y, final_y, my, extend_dist_border_y_max, px)
for y in range(start_y, final_y, +1):
if self.can_place(px, y, z, model)==False:
y -= 1
+4 -1
View File
@@ -24,6 +24,7 @@ redis_config = {
url_send_layout = 'https://mp.api.suwa3d.com/api/printTypeSettingOrder/printTypeSettingOrderSuccess'
url_get_info_by_printIds = "https://mp.api.suwa3d.com/api/printOrder/getInfoByPrintIds?print_ids="
url_get_oss_suffix_by_orderId = f"https://mp.api.suwa3d.com/api/order/getOssSuffixByOrderId?order_id="
# -------------------------- 结束:网络配置 -------------------------------
@@ -47,6 +48,8 @@ small_machine_size = [380, 345, 250]
# local_data= {'machine_print_counts': 150, 'machine_type': 'big_machine', 'pre_batch_id': 9910032, 'print_machine_id': 14, 'print_orders': [{'counts': 1, 'layout_z': 35.62070959151145, 'model_weight': 41.862, 'order_id': 917900, 'pid': 376666, 'print_id': 126318}, {'counts': 1, 'layout_z': 31.380497732946978, 'model_weight': 35.158, 'order_id': 917810, 'pid': 376562, 'print_id': 126413}, {'counts': 1, 'layout_z': 26.136854969886777, 'model_weight': 21.403, 'order_id': 917820, 'pid': 376572, 'print_id': 126414}, {'counts': 1, 'layout_z': 37.967177899738104, 'model_weight': 30.48, 'order_id': 917922, 'pid': 376684, 'print_id': 126415}, {'counts': 1, 'layout_z': 20.368887098446734, 'model_weight': 13.097, 'order_id': 918228, 'pid': 377198, 'print_id': 126417}, {'counts': 1, 'layout_z': 21.4227336927951, 'model_weight': 15.859, 'order_id': 917576, 'pid': 376345, 'print_id': 126769}, {'counts': 1, 'layout_z': 27.539947066784066, 'model_weight': 25.185, 'order_id': 917811, 'pid': 376564, 'print_id': 126875}, {'counts': 1, 'layout_z': 31.692723822970393, 'model_weight': 32.796, 'order_id': 917821, 'pid': 376592, 'print_id': 126876}, {'counts': 1, 'layout_z': 20.20031720146163, 'model_weight': 8.664, 'order_id': 917822, 'pid': 376602, 'print_id': 126877}, {'counts': 1, 'layout_z': 22.41680629925537, 'model_weight': 15.206, 'order_id': 917827, 'pid': 376616, 'print_id': 126878}, {'counts': 1, 'layout_z': 25.443981671314514, 'model_weight': 11.965, 'order_id': 917879, 'pid': 376635, 'print_id': 126879}, {'counts': 1, 'layout_z': 31.09222672704002, 'model_weight': 20.318, 'order_id': 917902, 'pid': 376667, 'print_id': 126882}, {'counts': 1, 'layout_z': 30.3317820592175, 'model_weight': 32.964, 'order_id': 917903, 'pid': 376668, 'print_id': 126884}, {'counts': 1, 'layout_z': 28.69639626624317, 'model_weight': 27.751, 'order_id': 917904, 'pid': 376669, 'print_id': 126885}, {'counts': 1, 'layout_z': 28.043180029163203, 'model_weight': 19.866, 'order_id': 917917, 'pid': 376677, 'print_id': 126886}, {'counts': 1, 'layout_z': 28.58783468947201, 'model_weight': 25.505, 'order_id': 918196, 'pid': 377126, 'print_id': 126888}, {'counts': 1, 'layout_z': 43.55871899466554, 'model_weight': 63.512, 'order_id': 918201, 'pid': 377131, 'print_id': 126890}, {'counts': 1, 'layout_z': 32.52479624889478, 'model_weight': 22.943, 'order_id': 918203, 'pid': 377133, 'print_id': 126891}, {'counts': 1, 'layout_z': 33.21834123013511, 'model_weight': 42.163, 'order_id': 918206, 'pid': 377139, 'print_id': 126892}, {'counts': 1, 'layout_z': 27.81674335447885, 'model_weight': 15.455, 'order_id': 918207, 'pid': 377141, 'print_id': 126893}, {'counts': 1, 'layout_z': 29.78203639784899, 'model_weight': 29.696, 'order_id': 918231, 'pid': 377201, 'print_id': 126894}, {'counts': 1, 'layout_z': 23.66875736859606, 'model_weight': 13.39, 'order_id': 915637, 'pid': 373135, 'print_id': 126895}, {'counts': 1, 'layout_z': 29.00408914521088, 'model_weight': 19.553, 'order_id': 918246, 'pid': 377209, 'print_id': 126897}, {'counts': 1, 'layout_z': 24.44397251338635, 'model_weight': 15.424, 'order_id': 918325, 'pid': 376974, 'print_id': 126899}, {'counts': 1, 'layout_z': 31.755406379699707, 'model_weight': 31.131, 'order_id': 918492, 'pid': 377584, 'print_id': 126900}, {'counts': 1, 'layout_z': 38.03699946264237, 'model_weight': 47.412, 'order_id': 918493, 'pid': 377587, 'print_id': 126901}, {'counts': 1, 'layout_z': 43.52919799223749, 'model_weight': 37.842, 'order_id': 918494, 'pid': 377589, 'print_id': 126902}, {'counts': 1, 'layout_z': 25.906302369108843, 'model_weight': 18.64, 'order_id': 918495, 'pid': 377590, 'print_id': 126903}, {'counts': 1, 'layout_z': 36.02611978829816, 'model_weight': 43.814, 'order_id': 918496, 'pid': 377591, 'print_id': 126904}, {'counts': 1, 'layout_z': 26.020689766262052, 'model_weight': 18.513, 'order_id': 918497, 'pid': 377594, 'print_id': 126905}, {'counts': 1, 'layout_z': 23.988078117370605, 'model_weight': 15.753, 'order_id': 918498, 'pid': 377596, 'print_id': 126906}, {'counts': 1, 'layout_z': 27.457814063914604, 'model_weight': 23.507, 'order_id': 918500, 'pid': 377601, 'print_id': 126908}, {'counts': 1, 'layout_z': 29.306090320672993, 'model_weight': 25.043, 'order_id': 918501, 'pid': 377605, 'print_id': 126909}, {'counts': 1, 'layout_z': 29.070231478924583, 'model_weight': 25.598, 'order_id': 918504, 'pid': 377606, 'print_id': 126910}, {'counts': 1, 'layout_z': 24.314504768436095, 'model_weight': 18.68, 'order_id': 918555, 'pid': 377684, 'print_id': 126911}, {'counts': 1, 'layout_z': 37.52979171030315, 'model_weight': 53.541, 'order_id': 918558, 'pid': 377689, 'print_id': 126913}, {'counts': 1, 'layout_z': 26.530791960490333, 'model_weight': 15.082, 'order_id': 918560, 'pid': 377702, 'print_id': 126915}, {'counts': 1, 'layout_z': 23.604568481445312, 'model_weight': 21.614, 'order_id': 918583, 'pid': 377748, 'print_id': 126917}, {'counts': 1, 'layout_z': 27.865868478825355, 'model_weight': 22.6, 'order_id': 918636, 'pid': 37Line truncated
# local_data= {"machine_print_counts":50, 'machine_type': 'small_machine',"pre_batch_id":991112,"print_machine_id":22,"print_orders":[{"counts":1,"layout_z":3.543965775898459,"model_weight":12.833,"order_id":857420,"pid":268473,"print_id":85240},{"counts":1,"layout_z":7.798861189952786,"model_weight":13.784,"order_id":875986,"pid":305425,"print_id":88136}]}
local_data= {'machine_print_counts': 130, 'machine_type': 'big_machine', 'pre_batch_id': 10188, 'print_machine_id': 15, 'print_orders': [{'counts': 1, 'layout_z': 32.65071311811036, 'model_weight': 68.084, 'order_id': 926400, 'pid': 389256, 'print_id': 134168}, {'counts': 1, 'layout_z': 31.780598561603746, 'model_weight': 25.511, 'order_id': 926573, 'pid': 389465, 'print_id': 134170}, {'counts': 1, 'layout_z': 5.202356934547428, 'model_weight': 11.705, 'order_id': 925909, 'pid': 388682, 'print_id': 134178}, {'counts': 1, 'layout_z': 5.1447470188140905, 'model_weight': 12.186, 'order_id': 925910, 'pid': 388683, 'print_id': 134179}, {'counts': 1, 'layout_z': 5.013986945152283, 'model_weight': 11.364, 'order_id': 925932, 'pid': 388707, 'print_id': 134180}, {'counts': 1, 'layout_z': 5.020000934600831, 'model_weight': 11.396, 'order_id': 926770, 'pid': 389842, 'print_id': 134183}, {'counts': 1, 'layout_z': 40.05588230441501, 'model_weight': 60.578, 'order_id': 926776, 'pid': 389895, 'print_id': 134185}, {'counts': 1, 'layout_z': 46.23669371110479, 'model_weight': 56.196, 'order_id': 926778, 'pid': 389918, 'print_id': 134186}, {'counts': 1, 'layout_z': 24.822566986083984, 'model_weight': 31.522, 'order_id': 926268, 'pid': 389067, 'print_id': 134211}, {'counts': 1, 'layout_z': 25.085425667575343, 'model_weight': 31.077, 'order_id': 926267, 'pid': 389066, 'print_id': 134212}, {'counts': 1, 'layout_z': 18.154759649173364, 'model_weight': 6.256, 'order_id': 927059, 'pid': 390269, 'print_id': 134216}, {'counts': 1, 'layout_z': 24.2420189021486, 'model_weight': 14.472, 'order_id': 927065, 'pid': 390275, 'print_id': 134220}, {'counts': 1, 'layout_z': 16.757099114319693, 'model_weight': 5.335, 'order_id': 927078, 'pid': 390299, 'print_id': 134226}, {'counts': 1, 'layout_z': 18.796780948141503, 'model_weight': 7.295, 'order_id': 927079, 'pid': 390300, 'print_id': 134228}, {'counts': 1, 'layout_z': 17.920740666248633, 'model_weight': 7.869, 'order_id': 927082, 'pid': 390303, 'print_id': 134229}, {'counts': 1, 'layout_z': 16.320665859825066, 'model_weight': 4.73, 'order_id': 927081, 'pid': 390302, 'print_id': 134230}, {'counts': 1, 'layout_z': 23.250497020255544, 'model_weight': 15.567, 'order_id': 927100, 'pid': 390331, 'print_id': 134242}, {'counts': 1, 'layout_z': 26.276874511435977, 'model_weight': 19.813, 'order_id': 927103, 'pid': 390334, 'print_id': 134246}, {'counts': 1, 'layout_z': 17.08049576865031, 'model_weight': 5.858, 'order_id': 927111, 'pid': 390342, 'print_id': 134254}, {'counts': 1, 'layout_z': 19.196685578562278, 'model_weight': 6.465, 'order_id': 927117, 'pid': 390347, 'print_id': 134261}, {'counts': 1, 'layout_z': 26.507062216602122, 'model_weight': 14.287, 'order_id': 927116, 'pid': 390346, 'print_id': 134262}, {'counts': 1, 'layout_z': 16.440782827635232, 'model_weight': 5.493, 'order_id': 927118, 'pid': 390348, 'print_id': 134263}, {'counts': 1, 'layout_z': 41.42868301509347, 'model_weight': 68.274, 'order_id': 927122, 'pid': 390354, 'print_id': 134264}, {'counts': 1, 'layout_z': 15.705368176518945, 'model_weight': 4.423, 'order_id': 927119, 'pid': 390349, 'print_id': 134265}, {'counts': 1, 'layout_z': 16.363223697461702, 'model_weight': 5.634, 'order_id': 927120, 'pid': 390351, 'print_id': 134266}, {'counts': 1, 'layout_z': 24.653417686230497, 'model_weight': 17.851, 'order_id': 927121, 'pid': 390353, 'print_id': 134267}, {'counts': 1, 'layout_z': 24.327745611835496, 'model_weight': 28.23, 'order_id': 926040, 'pid': 388832, 'print_id': 134268}, {'counts': 1, 'layout_z': 27.301779030909188, 'model_weight': 23.926, 'order_id': 923281, 'pid': 385001, 'print_id': 134269}, {'counts': 1, 'layout_z': 25.869120288866796, 'model_weight': 32.329, 'order_id': 926077, 'pid': 388864, 'print_id': 134270}, {'counts': 1, 'layout_z': 36.37214874852985, 'model_weight': 65.744, 'order_id': 926086, 'pid': 388873, 'print_id': 134271}, {'counts': 1, 'layout_z': 37.44403689090713, 'model_weight': 80.67, 'order_id': 926097, 'pid': 388884, 'print_id': 134273}, {'counts': 1, 'layout_z': 27.890566642299536, 'model_weight': 22.715, 'order_id': 927127, 'pid': 390372, 'print_id': 134274}, {'counts': 1, 'layout_z': 17.392635113631542, 'model_weight': 5.297, 'order_id': 927128, 'pid': 390373, 'print_id': 134275}, {'counts': 1, 'layout_z': 26.139986312446986, 'model_weight': 15.312, 'order_id': 927129, 'pid': 390375, 'print_id': 134276}, {'counts': 1, 'layout_z': 17.491576609126483, 'model_weight': 6.495, 'order_id': 927130, 'pid': 390376, 'print_id': 134277}, {'counts': 1, 'layout_z': 15.57976295844962, 'model_weight': 5.443, 'order_id': 927131, 'pid': 390377, 'print_id': 134278}, {'counts': 1, 'layout_z': 16.006999969482422, 'model_weight': 4.683, 'order_id': 927132, 'pid': 390378, 'print_id': 134279}, {'counts': 1, 'layout_z': 18.770485206437296, 'model_weight': 6.114, 'order_id': 927137, 'pid': 390383, 'print_id': 134280}, {'counts': 1, 'layout_z': 21.480148458997267, 'model_weight': 9.586, 'order_id': 927133, 'pid': 390379, 'Line truncated
local_data= {'machine_print_counts': 130, 'machine_type': 'big_machine', 'pre_batch_id': 9910188, 'print_machine_id': 15, 'print_orders': [{'counts': 1, 'layout_z': 32.65071311811036, 'model_weight': 68.084, 'order_id': 926400, 'pid': 389256, 'print_id': 134168}, {'counts': 1, 'layout_z': 31.780598561603746, 'model_weight': 25.511, 'order_id': 926573, 'pid': 389465, 'print_id': 134170}, {'counts': 1, 'layout_z': 5.202356934547428, 'model_weight': 11.705, 'order_id': 925909, 'pid': 388682, 'print_id': 134178}, {'counts': 1, 'layout_z': 5.1447470188140905, 'model_weight': 12.186, 'order_id': 925910, 'pid': 388683, 'print_id': 134179}, {'counts': 1, 'layout_z': 5.013986945152283, 'model_weight': 11.364, 'order_id': 925932, 'pid': 388707, 'print_id': 134180}, {'counts': 1, 'layout_z': 5.020000934600831, 'model_weight': 11.396, 'order_id': 926770, 'pid': 389842, 'print_id': 134183}, {'counts': 1, 'layout_z': 40.05588230441501, 'model_weight': 60.578, 'order_id': 926776, 'pid': 389895, 'print_id': 134185}, {'counts': 1, 'layout_z': 46.23669371110479, 'model_weight': 56.196, 'order_id': 926778, 'pid': 389918, 'print_id': 134186}, {'counts': 1, 'layout_z': 24.822566986083984, 'model_weight': 31.522, 'order_id': 926268, 'pid': 389067, 'print_id': 134211}, {'counts': 1, 'layout_z': 25.085425667575343, 'model_weight': 31.077, 'order_id': 926267, 'pid': 389066, 'print_id': 134212}, {'counts': 1, 'layout_z': 18.154759649173364, 'model_weight': 6.256, 'order_id': 927059, 'pid': 390269, 'print_id': 134216}, {'counts': 1, 'layout_z': 24.2420189021486, 'model_weight': 14.472, 'order_id': 927065, 'pid': 390275, 'print_id': 134220}, {'counts': 1, 'layout_z': 16.757099114319693, 'model_weight': 5.335, 'order_id': 927078, 'pid': 390299, 'print_id': 134226}, {'counts': 1, 'layout_z': 18.796780948141503, 'model_weight': 7.295, 'order_id': 927079, 'pid': 390300, 'print_id': 134228}, {'counts': 1, 'layout_z': 17.920740666248633, 'model_weight': 7.869, 'order_id': 927082, 'pid': 390303, 'print_id': 134229}, {'counts': 1, 'layout_z': 16.320665859825066, 'model_weight': 4.73, 'order_id': 927081, 'pid': 390302, 'print_id': 134230}, {'counts': 1, 'layout_z': 23.250497020255544, 'model_weight': 15.567, 'order_id': 927100, 'pid': 390331, 'print_id': 134242}, {'counts': 1, 'layout_z': 26.276874511435977, 'model_weight': 19.813, 'order_id': 927103, 'pid': 390334, 'print_id': 134246}, {'counts': 1, 'layout_z': 17.08049576865031, 'model_weight': 5.858, 'order_id': 927111, 'pid': 390342, 'print_id': 134254}, {'counts': 1, 'layout_z': 19.196685578562278, 'model_weight': 6.465, 'order_id': 927117, 'pid': 390347, 'print_id': 134261}, {'counts': 1, 'layout_z': 26.507062216602122, 'model_weight': 14.287, 'order_id': 927116, 'pid': 390346, 'print_id': 134262}, {'counts': 1, 'layout_z': 16.440782827635232, 'model_weight': 5.493, 'order_id': 927118, 'pid': 390348, 'print_id': 134263}, {'counts': 1, 'layout_z': 41.42868301509347, 'model_weight': 68.274, 'order_id': 927122, 'pid': 390354, 'print_id': 134264}, {'counts': 1, 'layout_z': 15.705368176518945, 'model_weight': 4.423, 'order_id': 927119, 'pid': 390349, 'print_id': 134265}, {'counts': 1, 'layout_z': 16.363223697461702, 'model_weight': 5.634, 'order_id': 927120, 'pid': 390351, 'print_id': 134266}, {'counts': 1, 'layout_z': 24.653417686230497, 'model_weight': 17.851, 'order_id': 927121, 'pid': 390353, 'print_id': 134267}, {'counts': 1, 'layout_z': 24.327745611835496, 'model_weight': 28.23, 'order_id': 926040, 'pid': 388832, 'print_id': 134268}, {'counts': 1, 'layout_z': 27.301779030909188, 'model_weight': 23.926, 'order_id': 923281, 'pid': 385001, 'print_id': 134269}, {'counts': 1, 'layout_z': 25.869120288866796, 'model_weight': 32.329, 'order_id': 926077, 'pid': 388864, 'print_id': 134270}, {'counts': 1, 'layout_z': 36.37214874852985, 'model_weight': 65.744, 'order_id': 926086, 'pid': 388873, 'print_id': 134271}, {'counts': 1, 'layout_z': 37.44403689090713, 'model_weight': 80.67, 'order_id': 926097, 'pid': 388884, 'print_id': 134273}, {'counts': 1, 'layout_z': 27.890566642299536, 'model_weight': 22.715, 'order_id': 927127, 'pid': 390372, 'print_id': 134274}, {'counts': 1, 'layout_z': 17.392635113631542, 'model_weight': 5.297, 'order_id': 927128, 'pid': 390373, 'print_id': 134275}, {'counts': 1, 'layout_z': 26.139986312446986, 'model_weight': 15.312, 'order_id': 927129, 'pid': 390375, 'print_id': 134276}, {'counts': 1, 'layout_z': 17.491576609126483, 'model_weight': 6.495, 'order_id': 927130, 'pid': 390376, 'print_id': 134277}, {'counts': 1, 'layout_z': 15.57976295844962, 'model_weight': 5.443, 'order_id': 927131, 'pid': 390377, 'print_id': 134278}, {'counts': 1, 'layout_z': 16.006999969482422, 'model_weight': 4.683, 'order_id': 927132, 'pid': 390378, 'print_id': 134279}, {'counts': 1, 'layout_z': 18.770485206437296, 'model_weight': 6.114, 'order_id': 927137, 'pid': 390383, 'print_id': 134280}, {'counts': 1, 'layout_z': 21.480148458997267, 'model_weight': 9.586, 'order_id': 927133, 'pid': 390379,Line truncated
test_print_max = 80
# -------------------------- 结束:测试相关 -------------------------------
+3 -9
View File
@@ -16,6 +16,7 @@ import argparse
from config import print_factory_type_dir
from config import oss_config
from config import print_data_dir
from config import url_get_oss_suffix_by_orderId
from general import is_use_debug_oss
from general import transform_save_o3d
@@ -1291,19 +1292,13 @@ def read_pids_from_json(pid_file):
return list_model_info, data
def download_data_by_json(model_info, workdir, oss_client ):
'''
下载卡通化数据
'''
try:
pid = model_info.pid
model_height = model_info.model_height
# target_dir = f"{workdir}/{pid}_image"
target_dir = f"{workdir}"
# {"code":1000,"data":"base_cartoon/badge/101/3/init_obj","message":"success1"}
# https://mp.api.suwa3d.com/api/order/getOssSuffixByOrderId?order_id=879312
url = f"https://mp.api.suwa3d.com/api/order/getOssSuffixByOrderId?order_id={model_info.order_id}"
url = f"{url_get_oss_suffix_by_orderId}{model_info.order_id}"
res = requests.get(url)
data = res.json()["data"]
@@ -1334,7 +1329,6 @@ class BatchModelInfo:
count: str
def read_paths_from_batch(batch_id):
url = f"https://mp.api.suwa3d.com/api/printOrder/getInfoByPrintBatchId?batch_id={batch_id}"
res = requests.get(url)
+3 -1
View File
@@ -13,6 +13,8 @@ import requests
import json
import shutil
from config import url_get_oss_suffix_by_orderId
def download_transform_save_by_json(pid_file, workdir, oss_config):
layout_data = download_datas_by_json(pid_file, workdir, oss_config)
original_obj_pid_dir = workdir
@@ -221,7 +223,7 @@ def download_data_by_json(model_info, workdir, oss_client ):
model_height = model_info.model_height
target_dir = f"{workdir}"
url = f"https://mp.api.suwa3d.com/api/order/getOssSuffixByOrderId?order_id={model_info.order_id}"
url = f"{url_get_oss_suffix_by_orderId}{model_info.order_id}"
res = requests.get(url)
data = res.json()["data"]
+1 -1
View File
@@ -258,7 +258,7 @@ def is_same_obj(obj_name1, obj_name2):
pre_name1 = obj_name1.split("_x")[0]
pre_name2 = obj_name2.split("_x")[0]
print(f"pre_name1={pre_name1}, pre_name2={pre_name2}")
# print(f"pre_name1={pre_name1}, pre_name2={pre_name2}")
if (pre_name1==pre_name2):
return True
+1 -368
View File
@@ -9,18 +9,12 @@ import open3d as o3d
import numpy as np
from plyfile import PlyData, PlyElement
from config import print_factory_type_dir
from general import mesh_tranform_to_pcd
from general import need_upload_result
from general import read_mesh
from compute_print_net import get_models_bbox
from compute_print_net import arrange_models_on_platform
from compute_print_net import Platform
from compute_print_net import down_sample
from compute_print_net import compute_bbox_all
from compute_print_net import compute_bbox_all_ext
def make_bbox_for_print(base_original_obj_dir,dict_bad,dict_origin,is_downsample):
"""获取需要的盒子大小"""
@@ -87,7 +81,6 @@ def get_pcd_by_matrix(dict_mesh_obj,dict_total_matrix,dict_ply_name):
return dict_pcd_fix
def ply_print_layout_platform(dict_pcd_fix,dict_pcd_fix2,machine_size,dict_total_matrix,all_models):
"""根据排版结果移动点云到指定位置"""
# placed_models,unplaced_models = get_models_box_size(dict_fix,machine_size)
@@ -144,32 +137,6 @@ def ply_print_layout_platform(dict_pcd_fix,dict_pcd_fix2,machine_size,dict_total
return placed_models
def get_models_bbox_net(dict_pcd_fix):
return get_models_bbox(dict_pcd_fix)
"""
def get_models_box_size(dict_fix,machine_size):
#获取排版的盒子大小
models = []
for ply_file in dict_fix:
bbox_with_text = ply_file.split("=")
bbox_with = bbox_with_text[-1]
split_text = bbox_with.replace(".ply","").split("+")
extend_dist = 2
x_length = int(float(split_text[2])*100) + extend_dist
y_length = int(float(split_text[0])*100) + extend_dist
z_length = int(float(split_text[1])*100) + extend_dist
#print("get_models_box_size",x_length,y_length,z_length)
models.append({'name':ply_file,'dimensions':(int(x_length/100),int(z_length/100),int(y_length/100))})
print(models)
platform = Platform(int(machine_size[0]), int(machine_size[1]), int(machine_size[2]))
print("开始计算排序...")
platform.arrange_models(models)
platform.print_results()
return platform.get_result()
"""
def compute_distance(pcd1, pcd2):
"""
正确计算两个点云之间距离的函数。
@@ -187,44 +154,6 @@ def compute_distance(pcd1, pcd2):
# return min_dist, mean_dist, distances
return min_dist
def compute_distance_x(pcd1, pcd2):
points1 = np.asarray(pcd1.points)[:, 0] # 提取所有X坐标[3](@ref)
points2 = np.asarray(pcd2.points)[:, 0]
x_diff = np.abs(points1[:, np.newaxis] - points2)
return np.min(x_diff)
def compute_distance_y(pcd1, pcd2):
points1 = np.asarray(pcd1.points)[:, 1] # 提取所有Y坐标[3](@ref)
points2 = np.asarray(pcd2.points)[:, 1]
y_diff = np.abs(points1.reshape(-1, 1) - points2)
return np.min(y_diff)
def check_collision_x(pcd_moving, static_pcds,collision_threshold):
moving_points = np.asarray(pcd_moving.points)
min_distance_to_x_axis = np.min(np.abs(moving_points[:, 1])) # Y 坐标即为与 X 轴的距离
#print(f"与 X 轴的最小距离: {min_distance_to_x_axis}")
#print(f"与 Y 轴的最小距离: {min_distance_to_y_axis}")
#print(f"pcd_moving{len(static_pcds)}")
if min_distance_to_x_axis < collision_threshold:
print(f"与 X 轴发生碰撞! 最小距离: {min_distance_to_x_axis}")
return True
return check_collision_all(pcd_moving, static_pcds,collision_threshold)
def check_collision_y(pcd_moving, static_pcds,collision_threshold):
moving_points = np.asarray(pcd_moving.points)
#print(f"与 X 轴的最小距离: {min_distance_to_x_axis}")
min_distance_to_y_axis = np.min(np.abs(moving_points[:, 0])) # X 坐标即为与 Y 轴的距离
#print(f"与 Y 轴的最小距离: {min_distance_to_y_axis}")
#print(f"pcd_moving{len(static_pcds)}")
if min_distance_to_y_axis < collision_threshold:
print(f"与 Y 轴发生碰撞! 最小距离: {min_distance_to_y_axis}")
return True
return check_collision_all(pcd_moving, static_pcds,collision_threshold)
import numpy as np
def compute_aabb(pcd):
@@ -349,9 +278,6 @@ def compact_mode_for_min_dis_json(placed_models,dict_unplaced,dict_bounds_fix,ma
else:
pcd_second.append(pcd)
# pcd_all.append(pcd_downsampled)
# name_list.append(model['name'])
# model_list.append(model)
dict_name[pcd] = model['name']
dict_model[pcd] = model
dx = model['dimensions'][0]
@@ -374,7 +300,6 @@ def compact_mode_for_min_dis_json(placed_models,dict_unplaced,dict_bounds_fix,ma
if max_delta_x < 10:
draw_down = False
# for idx, pcd in enumerate(pcd_all):
for idx, pcd in enumerate(pcd_first):
if dict_model[pcd]['first_line']:
@@ -1001,15 +926,6 @@ def compact_mode_for_min_dis_json(placed_models,dict_unplaced,dict_bounds_fix,ma
#"""
last_pcd_processed.append(pcd)
"""
print("is_x_top",is_x_top)
if not is_x_top:
last_pcd_processed.append(pcd)
print("last_pcd_processed.append",name)
else:
print("fail last_pcd_processed.append",name, is_x_top)
"""
# o3d.io.write_point_cloud(os.path.join(output_dir, name), pcd)
dict_total_matrix[obj_name]= T_trans1 @ dict_total_matrix[obj_name]
@@ -1029,19 +945,6 @@ def move_to_top_left(pcd, edge_x_min, edge_y_max):
return T_transTemp
def move_to_bottom_left(pcd, edge_x_min, edge_y_min):
points = np.asarray(pcd.points)
min_x = np.min(points[:, 0])
min_y = np.min(points[:, 1])
tx = edge_x_min - min_x
ty = edge_y_min - min_y
pcd.translate((tx, ty, 0), relative=True)
T_transTemp = np.eye(4)
T_transTemp[:3, 3] = [tx, ty, 0]
return T_transTemp
def move_to_bottom_right(pcd, edge_x_max, edge_y_min):
points = np.asarray(pcd.points)
@@ -1066,229 +969,8 @@ def get_axis_aligned_bbox(pcd):
'z_max': np.max(points[:,2])
}
def down_obj_data_to_ply(weight_fix_out_obj_dir,weight_fix_out_ply_dir):
""""""
obj_file_list = [aa for aa in os.listdir(weight_fix_out_obj_dir) if aa.endswith(".obj")]
for obj_name in obj_file_list:
obj_path = os.path.join(weight_fix_out_obj_dir,obj_name)
mesh_obj = read_mesh(obj_path)
vertices = np.asarray(mesh_obj.vertices)
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(vertices)
voxel_size = 3 # 设置体素的大小,决定下采样的密度
pcd_downsampled = down_sample(pcd, voxel_size)
ply_out_path = os.path.join(weight_fix_out_ply_dir,obj_name.replace(".obj",".ply"))
o3d.io.write_point_cloud(ply_out_path, pcd_downsampled)
print(ply_out_path,"下采样完成。")
def compute_centroid_compact(pcd):
points = np.asarray(pcd.points)
centroid = np.mean(points, axis=0)
return centroid
def compute_base_point(pcd):
points = np.asarray(pcd.points)
x_center = np.mean(points[:, 0])
y_center = np.mean(points[:, 1])
min_z = np.min(points[:, 2])
return np.array([x_center, y_center, min_z])
import copy
def move_obj_to_compact_bounds(bounds_fix_out_dir,bounds_compact_out_dir,weight_fix_out_obj_dir,base_original_obj_dir,compact_obj_out_dir,dict_mesh_obj,dict_unplaced,placed_remove_dir,dict_bad,bad_dir,full_dir,dict_bounds_fix,dict_compact,dict_origin):
""""""
# obj_file_list = [aa for aa in os.listdir(weight_fix_out_obj_dir) if aa.endswith(".obj")]
obj_file_list = list(dict_mesh_obj.keys())
ply_path_dict = {}
# meshes = []
# for ply_file_name in os.listdir(bounds_fix_out_dir):
for ply_file_name in dict_bounds_fix:
ply_dict_key = ply_file_name.split("=")[0]
ply_path_dict[ply_dict_key] = ply_file_name
for obj_name in obj_file_list:
obj_path = os.path.join(weight_fix_out_obj_dir, obj_name)
# mesh_obj = read_mesh(obj_path, False)
mesh_obj = dict_mesh_obj[obj_name]
# mesh_obj = dict_origin[obj_origin_path]
original_obj_pid_dir = base_original_obj_dir
obj_origin_path = os.path.join(original_obj_pid_dir, obj_name)
obj_origin = dict_origin[obj_origin_path]
# obj_origin = copy.deepcopy(dict_origin[obj_origin_path])
ply_name_pid = obj_name.replace(".obj","")
# ply_name = ply_path_dict[ply_name_pid]
ply_name = ply_path_dict.get(ply_name_pid,None)
print(ply_name_pid,ply_name)
if ply_name is None:
continue
print("move_obj_to_compact_bounds",ply_name,len(dict_unplaced))
if not ply_name or ply_name in dict_unplaced:
print("unplaced",ply_name)
continue
ply_fix_path = os.path.join(bounds_fix_out_dir,ply_name)
ply_compact_path = os.path.join(bounds_compact_out_dir, ply_name)
# pcd_fix = o3d.io.read_point_cloud(ply_fix_path)
pcd_fix = dict_bounds_fix[ply_name]
vertices = np.asarray(obj_origin.vertices)
pcd_origin = o3d.geometry.PointCloud()
pcd_origin.points = o3d.utility.Vector3dVector(vertices)
# pcd_compact = o3d.io.read_point_cloud(ply_compact_path)
pcd_compact = dict_compact[ply_name]
centroid_fix = compute_centroid_compact(pcd_fix)
centroid_compact = compute_centroid_compact(pcd_compact)
centroid_origin = compute_centroid_compact(pcd_origin)
displacement = centroid_compact - centroid_fix
# displacement = centroid_compact - centroid_origin
vertices = np.asarray(mesh_obj.vertices)
vertices_translated = vertices + displacement # 将位移应用到每个顶点
mesh_obj.vertices = o3d.utility.Vector3dVector(vertices_translated) # 更新网格顶点
obj_pid = obj_name.split("_P")[0]
#compact_obj_pid_out_dir = os.path.join(compact_obj_out_dir,obj_pid)
compact_obj_pid_out_dir= compact_obj_out_dir
if not os.path.exists(compact_obj_pid_out_dir):
os.makedirs(compact_obj_pid_out_dir)
obj_path_compact = os.path.join(compact_obj_pid_out_dir,obj_name)
mesh_obj.compute_vertex_normals()
o3d.io.write_triangle_mesh(obj_path_compact, mesh_obj,write_triangle_uvs=True)
print(obj_path_compact, "移动后obj保存完成", displacement)
# meshes.append(mesh_obj)
#original_obj_pid_dir = os.path.join(base_original_obj_dir,obj_pid)
original_obj_pid_dir = base_original_obj_dir
for mtl in os.listdir(compact_obj_pid_out_dir):
if mtl.endswith(".mtl"):
if obj_pid in mtl:
mtl_path = os.path.join(compact_obj_pid_out_dir,mtl)
os.remove(mtl_path)
mtl_name = None
tex_name = None
for file_name in os.listdir(original_obj_pid_dir):
if file_name.endswith(".mtl"):
if obj_pid in file_name:
mtl_name = file_name
if file_name.endswith(".jpg"):
if obj_pid in file_name:
tex_name = file_name
if file_name.endswith(".png"):
if obj_pid in file_name:
tex_name = file_name
for file in os.listdir(original_obj_pid_dir):
#print(f"file{file}")
if file.endswith(".obj"):
continue
if obj_pid not in file:
continue
origin_path = os.path.join(original_obj_pid_dir,file)
dis_path = os.path.join(compact_obj_pid_out_dir,file)
if os.path.isfile(origin_path):
#print(f'origin_path{origin_path}')
#print(f'dis_path{dis_path}')
shutil.copy(origin_path,dis_path)
time.sleep(1)
#print("-"*50)
base_origin_obj_path = os.path.join(original_obj_pid_dir,obj_name)
#print(f"base_origin_obj_path{base_origin_obj_path}")
#print(f"obj_path_compact{obj_path_compact}")
update_obj_file(base_origin_obj_path, obj_path_compact)
placed_remove_obj_path = os.path.join(placed_remove_dir, obj_name)
shutil.copy(base_origin_obj_path,placed_remove_obj_path)
os.remove(base_origin_obj_path)
exist_obj_any = False
exist_obj = False
delete_mtl = False
for file_name in os.listdir(original_obj_pid_dir):
if file_name.endswith(".obj"):
if obj_pid in file_name:
exist_obj = True
exist_obj_any = True
if not exist_obj_any:
delete_mtl = True
if not exist_obj:
delete_mtl = True
if delete_mtl:
print("delete_mtl",mtl_name,tex_name)
if mtl_name!=None:
base_origin_mtl_path = os.path.join(original_obj_pid_dir,mtl_name)
placed_remove_mtl_path = os.path.join(placed_remove_dir, mtl_name)
shutil.copy(base_origin_mtl_path,placed_remove_mtl_path)
os.remove(base_origin_mtl_path)
if tex_name!=None:
base_origin_tex_path = os.path.join(original_obj_pid_dir,tex_name)
placed_remove_tex_path = os.path.join(placed_remove_dir, tex_name)
shutil.copy(base_origin_tex_path,placed_remove_tex_path)
os.remove(base_origin_tex_path)
print(f"排版错误模型数量::{len(dict_bad)}")
for obj_name in dict_bad:
print("--错误模型名:", obj_name)
process_obj_files(original_obj_pid_dir,bad_dir,obj_name)
print(f"排版剩余模型数量::{len(dict_unplaced)}")
for ply_file_name in dict_unplaced:
obj_name = ply_file_name.split("=")[0]+".obj"
print("--剩余模型名:", obj_name)
process_obj_files(original_obj_pid_dir,full_dir,obj_name)
import json
def extract_angles(R):
# 提取绕X、Y、Z轴的旋转角度(弧度)
rx_rad = np.arctan2(R[2, 1], R[2, 2]) # X轴旋转
ry_rad = np.arcsin(-R[2, 0]) # Y轴旋转
rz_rad = np.arctan2(R[1, 0], R[0, 0]) # Z轴旋转
# 将弧度转换为角度(度数)
rx_deg = np.degrees(rx_rad)
ry_deg = np.degrees(ry_rad)
rz_deg = np.degrees(rz_rad)
return rx_deg, ry_deg, rz_deg
def compute_mesh_center(vertices):
"""
计算网格质心
参数:
vertices: 顶点坐标数组,形状为(N, 3)的NumPy数组或列表
返回:
centroid: 质心坐标的NumPy数组 [x, y, z]
"""
if len(vertices) == 0:
raise ValueError("顶点数组不能为空")
n = len(vertices) # 顶点数量
# 初始化坐标累加器
sum_x, sum_y, sum_z = 0.0, 0.0, 0.0
# 遍历所有顶点累加坐标值
for vertex in vertices:
sum_x += vertex[0]
sum_y += vertex[1]
sum_z += vertex[2]
# 计算各坐标轴的平均值
centroid = np.array([sum_x / n, sum_y / n, sum_z / n])
return centroid
import re
def extract_numbers_from_filename(filename):
"""
@@ -1313,7 +995,7 @@ def extract_numbers_from_filename(filename):
import requests
def move_obj_to_compact_bounds_json(base_original_obj_dir,dict_mesh_obj,dict_unplaced,dict_bad,bad_dir,full_dir,dict_bounds_fix,
dict_total_matrix,save_mesh,batch_id, print_start_time,selected_machine,selected_mode,version):
dict_total_matrix,batch_id, print_start_time,selected_machine,selected_mode,version):
"""生成3D打印布局的JSON数据并保存为3DPrintLayout.json"""
# 创建符合3DPrintLayout规范的JSON数据结构
layout_data = {
@@ -1429,10 +1111,6 @@ def move_obj_to_compact_bounds_json(base_original_obj_dir,dict_mesh_obj,dict_unp
print("--剩余模型名:", obj_name)
process_obj_files(original_obj_pid_dir,full_dir,obj_name)
if save_mesh:
cache_type_setting_dir=f"{base_original_obj_dir}/arrange"
transform_save_o3d(layout_data, original_obj_pid_dir, cache_type_setting_dir)
return send_layout_data
def process_obj_files(original_obj_pid_dir,placed_remove_dir,obj_name):
@@ -1494,31 +1172,6 @@ def process_obj_files(original_obj_pid_dir,placed_remove_dir,obj_name):
shutil.copy(base_origin_tex_path, placed_remove_tex_path)
os.remove(base_origin_tex_path)
def update_obj_file(original_obj_path,compact_obj_path):
""""""
with open(original_obj_path, "r") as f:
lines_original = f.readlines()
mtllib_name = None
mat_name = None
for line in lines_original:
if line.startswith("mtllib"):
mtllib_name = line.split(" ")[1]
elif line.startswith("usemtl"):
mat_name = line.split(" ")[1]
if mtllib_name and mat_name:
break
with open(compact_obj_path, "r") as f:
lines = f.readlines()
new_lines = []
for line2 in lines:
if line2.startswith("mtllib"):
line2 = f"mtllib {mtllib_name}\n" # 替换为原始 MTL 文件路径
elif line2.startswith("usemtl"):
line2 = f"usemtl {mat_name}\n" # 替换为原始贴图路径
new_lines.append(line2)
with open(compact_obj_path, "w") as f:
f.writelines(new_lines)
def pass_for_min_dis(placed_models, dict_unplaced, dict_bounds_fix):
pcd_all = []
@@ -1546,23 +1199,3 @@ def pass_for_min_dis(placed_models, dict_unplaced, dict_bounds_fix):
name = name_list[idx]
print("fail to place (x=0)", name_list[idx], y, dy)
dict_unplaced[name]=name
if __name__ == '__main__':
out_dir = "/data/datasets_20t/type_setting_test_data/"
weight_fix_out_obj_dir = f"{out_dir}/print_weight_fix_data_obj"
weight_fix_out_ply_dir = f"{out_dir}/data/datasets_20t/type_ssetting_test_data/print_weight_fix_data_ply"
base_original_obj_dir=f"{print_factory_type_dir}/8/"
if not os.path.exists(weight_fix_out_ply_dir):
os.makedirs(weight_fix_out_ply_dir)
bounds_fix_out_dir = f"{out_dir}/print_bounds_fix_data"
bounds_compact_out_dir = f"{out_dir}/print_bounds_compact_data"
compact_obj_out_dir = f"{out_dir}//print_compact_obj"
if not os.path.exists(bounds_fix_out_dir):
os.mkdir(bounds_fix_out_dir)
if not os.path.exists(bounds_compact_out_dir):
os.makedirs(bounds_compact_out_dir)
if not os.path.exists(compact_obj_out_dir):
os.makedirs(compact_obj_out_dir)
move_obj_to_compact_bounds(bounds_fix_out_dir,bounds_compact_out_dir,weight_fix_out_obj_dir,base_original_obj_dir,compact_obj_out_dir)
+4 -21
View File
@@ -13,6 +13,7 @@ from test_load_json import load_show_save
from download_print import upload_result
from config import print_factory_type_dir
from config import print_data_dir
from config import url_send_layout
from config import big_machine_size
from config import small_machine_size
@@ -101,12 +102,11 @@ def print_type_setting_obj(base_original_obj_dir=None,batch_id=0,selected_mode="
os.makedirs(full_dir)
is_small_machine = True if selected_machine=="小机型" else False
save_mesh = True if output_format=="模型" else False
version = "print_type_setting25.local"
send_layout_data = move_obj_to_compact_bounds_json(base_original_obj_dir,dict_mesh_obj,dict_unplaced,dict_bad,bad_dir,full_dir,dict_pcd_fix,
dict_total_matrix,save_mesh,batch_id,print_start_time,selected_machine,selected_mode,version)
dict_total_matrix,batch_id,print_start_time,selected_machine,selected_mode,version)
end_time4 = time.time()
print("排版完成")
@@ -151,7 +151,6 @@ def print_type_setting_obj(base_original_obj_dir=None,batch_id=0,selected_mode="
print(f"need_upload_result={need_upload_result()}")
if need_upload_result():
print(f"send_layout_data={send_layout_data}")
# url = 'https://mp.api.suwa3d.com/api/printTypeSettingOrder/printTypeSettingOrderSuccess'
url = url_send_layout
try:
response = requests.post(url, json.dumps(send_layout_data), timeout=30)
@@ -180,35 +179,19 @@ def print_type_setting_obj(base_original_obj_dir=None,batch_id=0,selected_mode="
return 0
def preview(base_original_obj_dir=None, batch_id=0):
load_show_save(base_original_obj_dir, {}, batch_id, True)
def get_pcd(obj, is_down_sample=True):
vertices = np.asarray(obj.vertices)
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(vertices)
if is_down_sample:
voxel_size = 3
pcd_downsampled = down_sample(pcd, voxel_size, False)
return pcd_downsampled
else:
return pcd
if __name__ == '__main__':
# parser = argparse.ArgumentParser()
# parser.add_argument("--batch_id", type=str, required=True, help="batch_id")
# args = parser.parse_args()
# batch_id = args.batch_id
batch_id = "9910032"
batch_id = "1"
src_dir = batch_id
selected_mode="紧凑" # 标准 紧凑
output_format="JSON" # 模型 JSON
selected_machine = "大机型" # 小机型 大机型
base_original_obj_dir = f"{print_factory_type_dir}/{src_dir}"
base_original_obj_dir = f"{print_data_dir}/{src_dir}"
print_type_setting_obj(base_original_obj_dir=base_original_obj_dir,
batch_id=batch_id,selected_mode=selected_mode,output_format=output_format,selected_machine=selected_machine)
+5 -7
View File
@@ -6,8 +6,8 @@ from PIL import Image
import argparse
import gc
from config import print_factory_type_dir
from config import print_data_dir
from config import test_print_max
from general import mesh_transform_by_matrix
from general import read_mesh
@@ -96,8 +96,9 @@ def load_and_transform_models(base_path, dict_origin, json_name):
print(f"已加载并变换: {index} {os.path.basename(obj_path)}")
index = index + 1
# if (index > 80):
# break
if test_print_max > 0:
if (index > test_print_max):
break
add_plank = True
if add_plank:
@@ -356,7 +357,7 @@ def set_orthographic(meshes, width=1920, height=1080,
del mesh
del points
gc.collect()
print(f"set_orthographic {index}")
# print(f"set_orthographic {index}")
index = index + 1
del meshes
@@ -405,7 +406,6 @@ def set_orthographic(meshes, width=1920, height=1080,
view_control.set_up([0, 1, 0])
ortho_width = ortho_width or 10.0
print("set_orthographic 1")
#for _ in range(2):
# vis.poll_events()
# vis.update_renderer()
@@ -413,10 +413,8 @@ def set_orthographic(meshes, width=1920, height=1080,
# 设置正交投影
try:
set_orthographic_camera(view_control)
print("set_orthographic 2")
except AttributeError:
set_orthographic_projection(view_control, ortho_scale=15.0)
print("set_orthographic 3")
#for _ in range(5):
# vis.poll_events()