मैं एक .ifc फ़ाइल पढ़ने के लिए ifcOpenshell का उपयोग कर रहा हूँ। कुछ परिवर्तन करें, फिर उसे एक नई .ifc फ़ाइल में लिखें। लेकिन IfcOpenshell यूनिकोड को उसी तरह नहीं लिख रहा है जैसे वह इसे पढ़ता है।

मैं एक स्क्रिप्ट बना रहा हूं जो प्रत्येक ifcelement में गुणों के साथ एक pset जोड़ता है। इन संपत्तियों का मूल्य मौजूदा संपत्तियों से कॉपी किया गया है। तो मूल रूप से मैं एक पीसेट बना रहा हूं जो एक ही स्थान पर चुनी गई जानकारी एकत्र करता है। यह तब तक बहुत अच्छा काम करता है जब तक कि मौजूदा मानों में यूनिकोड utf-8 न हो। मुद्रित होने पर सही मान दिखाने के लिए इसे पढ़ा और डिकोड किया जाता है, लेकिन यह यूनिकोड को उसी तरह नहीं लिखता है जैसे इसे पढ़ता है। मैंने PyCharm में इस्तेमाल किए गए यूनिकोड को बदलने की कोशिश की, कोई किस्मत नहीं। मुझे बिना किसी सुधार के सिमुलर पोस्ट कहीं और मिलीं। जो मैंने कहीं और पढ़ा है उससे यूनिकोड एन्कोडर/डिकोडर के साथ कुछ करना है ifcOpenshell उपयोग, लेकिन मुझे यकीन नहीं हो रहा है।

def mk_pset():
    global param_name
    global param_type
    global max_row
    global param_map
    wb = load_workbook(b)
    sheet = wb.active
    max_row = sheet.max_row
    max_column = sheet.max_column
    param_name = []
    param_type = []
    param_map=[]
    global pset_name
    pset_name = sheet.cell(row=2, column=1).value
    for pm in range(2, max_row+1):
        param_name.append((sheet.cell(pm, 2)).value)
        param_type.append((sheet.cell(pm, 3)).value)
        param_map.append((sheet.cell(pm,4)).value)
    print(param_type,' - ',len(param_type))
    print(param_name,' - ',len(param_name))
    create_pset()



def create_pset():

    ifcfile = ifcopenshell.open(ifc_loc)
    create_guid = lambda: ifcopenshell.guid.compress(uuid.uuid1().hex)
    owner_history = ifcfile.by_type("IfcOwnerHistory")[0]
    element = ifcfile.by_type("IfcElement")
    sets = ifcfile.by_type("IfcPropertySet")
    list = []
    for sett in sets:
        list.append(sett.Name)
    myset = set(list)
    global antall_parametere
    global index
    index = 0
    antall_parametere = len(param_name)

    if pset_name not in myset:
        property_values = []
        tot_elem = (len(element))
        cur_elem = 1
        for e in element:
            start_time_e=time.time()
            if not e.is_a() == 'IfcOpeningElement':
                type_element.append(e.is_a())
                for rel_e in e.IsDefinedBy:
                    if rel_e.is_a('IfcRelDefinesByProperties'):
                        if not rel_e[5][4] == None:
                            index = 0
                            while index < antall_parametere:
                                try:
                                    ind1 = 0
                                    antall_ind1 = len(rel_e[5][4])
                                    while ind1 < antall_ind1:
                                        if rel_e[5][4][ind1][0] == param_map[index]:
                                            try:
                                                if not rel_e[5][4][ind1][2]==None:
                                                    p_type = rel_e[5][4][ind1][2].is_a()
                                                    p_verdi =rel_e[5][4][ind1][2][0]
                                                    p_t=param_type[index]
                                                    property_values.append(ifcfile.createIfcPropertySingleValue(param_name[index], param_name[index],ifcfile.create_entity(p_type,p_verdi),None),)
                                                    ind1 += 1
                                                else:
                                                    ind1 +=1
                                            except TypeError:
                                                pass
                                                break
                                        else:
                                            ind1 += 1
                                except AttributeError and IndexError:
                                    pass
                                index += 1
                            index = 0
            property_set = ifcfile.createIfcPropertySet(create_guid(), owner_history, pset_name, pset_name,property_values)
            ifcfile.createIfcRelDefinesByProperties(create_guid(), owner_history, None, None, [e], property_set)
            ifc_loc_edit = str(ifc_loc.replace(".ifc", "_Edited.ifc"))
            property_values = []
            print(cur_elem, ' av ', tot_elem, ' elementer ferdig. ',int(tot_elem-cur_elem),'elementer gjenstår. Det tok ',format(time.time()-start_time_e),' sekunder')
            cur_elem += 1
        ifcfile.write(ifc_loc_edit)
    else:
        ###print("Pset finnes")
        sg.PopupError("Pset er allerede oprettet i modell.")

मुझे उम्मीद है कि p_verdi को p_verdi पढ़ने के बराबर लिखा जाएगा।

मूल पठन (D\X2\00F8\X0\r):

#2921= IFCBUILDINGELEMENTPROXYTYPE('3QPADpsq71CHeCe7e3GDm5',#32,'D\X2\00F8\X0\r',$,$,$,$,'DA64A373-DB41-C131-1A0C-A07A0340DC05',$,.NOTDEFINED.);

लिखित (डी\X4\000000F8\X0\r):

#2921=IFCBUILDINGELEMENTPROXYTYPE('3QPADpsq71CHeCe7e3GDm5',#32,'D\X4\000000F8\X0\r',$,$,$,$,'DA64A373-DB41-C131-1A0C-A07A0340DC05',$,.NOTDEFINED.);

"Dør" में डिकोड किया गया

यह हार्ड स्पेसिंग के साथ भी होता है:

('2\X2\00A0\X0\090')

सही ढंग से प्रिंट करता है:('2 090')

लिखा जाता है:

('2\X4\000000A0\X0\090')

सॉफ्टवेयर का उपयोग कर मेरे आईएफसी द्वारा लिखित प्रपत्र अपठनीय है।

1
Thomas M 27 अगस्त 2019, 21:09

1 उत्तर

सबसे बढ़िया उत्तर

वर्कअराउंड के रूप में इतना उत्तर नहीं।

अधिक शोध के बाद मुझे पता चला कि अधिकांश IFC रीडिंग सॉफ्टवेयर X4 कोडिंग का समर्थन नहीं करते हैं, इसलिए मैंने रेगेक्स के साथ वर्कअराउंड बनाया। मूल रूप से सब कुछ ढूंढ रहा है और \X4\0000 को \X2 से बदल रहा है। इसने अब तक मेरे द्वारा सामना किए गए सभी विशिष्ट वर्णों के साथ काम किया है। लेकिन जैसा कि कहा गया है, यह सिर्फ एक समाधान है जो शायद सभी के लिए काम नहीं करेगा।

def X4trans_2(target_file,temp_fil):
from re import findall
from os import remove,rename
dec_file = target_file.replace('.ifc', '_dec.ifc')
tempname = target_file
dec_list = []
with open(temp_fil, 'r+') as r,open(dec_file, 'w', encoding='cp1252') as f:
    for line in r:
        findX4 = findall(r'\\X4\\0000+[\w]+\\X0\\', str(line))
        if findX4:
            for fx in findX4:
                X4 = str(fx)
                newX = str(fx).replace('\\X4\\0000', '\X2\\')
                line = line.replace(str(X4), newX)  # print ('Fant X4')
        f.writelines(line)
remove(temp_fil)
try:
    remove(target_file)
except FileNotFoundError:
    pass

rename(dec_file,tempname)

यह मूल रूप से ifc को टेक्स्ट के रूप में खोलता है, X4 को X2 से ढूंढता है और प्रतिस्थापित करता है और इसे फिर से लिखता है।

0
Thomas M 6 मई 2020, 11:18